iOS优化开发的几种手段

来源:互联网 时间:2017-01-22





JSON返回空值

开发过程中,我们通过http请求,后台返回json数据,而有时数据里某一字段的值为null,然后我们把此值赋值给NSArray,NSdictionary,或是NSString会判断此值为null,做的处理通常是:


if(dict == nil)或是if(dict == Nil)或是if(dict == NULL)再或是if(dict isEqual nil)

但事实并不这么简单。
当字典,数组为null时,后台打印的输出结果是这样:




这就需要在代码判断时利用[NSNull null]来判断。


if(![location isEqual:[NSNull null]]){
NSLog(@"YES");
}

空字符串或数组中一个为空,会打印:<null> 。代表着这是一个空字符串,赋值为空,指针是存在的,只是内容为空。在iOS上,内容为空不能简单的判断str==null(null 在ios上得用[NSNull null])。


赋值为nil,可以直接用==nil来判断,相当于空指针。打印为:(null)


控制台打印:


str=(null)

代表着 字符串或数组或字典是一个空指针,(而非空字符串)判断的时候,直接用:


 if(str == nil)

就可以了。


内存泄露压力测试

用 dispatch 写个小函数,方便测试。


func dipatch_forever(duration: Double, _ queue : dispatch_queue_t, _ block : dispatch_block_t){ 
let time = dispatch_time(DISPATCH_TIME_NOW, Int64(duration * Double(NSEC_PER_SEC)))
dispatch_after(time, queue) {
block()
dipatch_forever(duration, queue, block)
}
}
func main_dipatch_forever(duration: Double, _ block : dispatch_block_t) {
dipatch_forever(duration, dispatch_get_main_queue(), block)
}

每当怀疑某界面或函数有问题。就随手写个回调,不断地 push 界面,pop 界面。或者不断地用随机数调用某些函数。或者创建删除对象。


main_dipatch_forever(0.0) {
// Do something
}

这样界面或函数中稍微有内存泄露,或者程序不稳定。就会很容易看到内存飞快地涨或程序直接崩掉。经得起这种压力测试的,那段程序基本会很稳定(正确性需要额外测)。


更改iphone的键盘颜色:

UIKeyboardTypeNumberPad,UIKeyboardTypePhonePad只有这2种数字键盘才有效果。


键盘外观


typedef enum {
UIKeyboardAppearanceDefault, // 默认外观:浅灰色
UIKeyboardAppearanceAlert, //深灰/石墨色
} UIKeyboardAppearance;
textView.keyboardAppearance = UIKeyboardAppearanceAlert ;
- (void)textViewDidBeginEditing:(UITextView *)textView{
NSArray *ws = [[UIApplication sharedApplication] windows];
for(UIView *w in ws){
NSArray *vs = [w subviews];
for(UIView *v in vs) {
if([[NSString stringWithUTF8String:object_getClassName(v)] isEqualToString:@"UIKeyboard"]){
v.backgroundColor = [UIColor redColor];
}
}
}

自动大写


typedef enum {
UITextAutocapitalizationTypeNone, //不自动大写
UITextAutocapitalizationTypeWords, //单词首字母大写
UITextAutocapitalizationTypeSentences, //句子首字母大写
UITextAutocapitalizationTypeAllCharacters, //所有字母大写
} UITextAutocapitalizationType;
用法用例:textField.autocapitalizationType = UITextAutocapitalizationTypeWords;

自动更正


typedef enum {
UITextAutocorrectionTypeDefault,//默认
UITextAutocorrectionTypeNo,//不自动更正
UITextAutocorrectionTypeYes,//自动更正
} UITextAutocorrectionType;
用法用例:textField.autocorrectionType = UITextAutocorrectionTypeYes;

查看一段代码的执行时间
#define Begin NSDate *startTime = [NSDate date]
#define Go NSLog(@"Time: %f", -[startTime timeIntervalSinceNow])

查看执行时间的代码的地方进行这么处理


Begin
//do your work here
Go

锯齿化问题

在使用view的缩放的时候,layer.border.width随着view的放大,会出现锯齿化的问题,解决这个问题需要设置这个属性。


self.layer.allowsEdgeAntialiasing = YES;

PullToMakeSoup

PullToMakeSoup


PullToMakeSoup 是一个下拉刷新控件,自定义动画效果,效果如gif图所示,可以轻松的加在UIScrollView之上。具体参考代码示例。


TwitterCover

TwitterCover


TwitterCover在下拉时会在 top view 上产生视差效果,可以应用于UIScrollView上,是一款纯UIKit framework。


//使用
#import "UIScrollView+TwitterCover.h"
UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:self.view.bounds];
[scrollView addTwitterCoverWithImage:[UIImage imageNamed:@"cover.png"]];

 [scrollView removeTwitterCoverView]; // 移除效果

使用就是这么简单!


Souhgoureading

Souhgoureading


Souhgoureading仿搜狗阅读,已完成基本UI 网页显示 搜索功能 根据搜索结果添加书本到书架和书本第一章试读。作者yintokey的博客也很用心。大家有兴趣可以看一看。


WSHorizontalListView

WSHorizontalListView


WSHorizontalListView是在UITableViewCell中添加横向滚动视图,用于展示不同图片。利用UICollectionView的优点,从而性能上有很大优化。具体使用参考代码。




相关阅读:
Top