您的位置:首页 > 移动开发 > IOS开发

iOS开发——iOS进阶

2016-06-01 21:27 316 查看
少导入头文件。

尽量不要在头文件引入其它的头文件,如果需要用到实例,则用@class导入,可防止循环引用,并且不需要编译到头文件的全部信息,减少编译时间。

多用字面量语法,少用与之等价的方法。

如使用NSString *string=@”a”;代替NSString *string=[[NSString alloc] initWithString:@”a”]; 使用NSArray *array=@[@”a”,@”b”];代替NSArray *array=[NSArray arrayWithObjects:@”a”,@”b”, nil];这样可以使语法更加清晰。

在对象内部读取或写入对象。

在对象内部读取数据时,应该直接通过实例变量来读,如:return [NSString stringWithFormat:@”%@”, _name]; 在写入数据时,应该通过属性来写,如:self.name=@”aa”;

通知。

在注册一个通知前,最好先注销一下此通知,防止数据处理后忘记注销或有同名的通知时发生混乱

局部刷新。

使用tableView时,如果不需要全部刷新,最好使用局部刷新,可减少cpu的损耗。刷新某行:NSIndexPath *te=[NSIndexPath indexPathForRow:1 inSection:2]; [mainTV reloadRowsAtIndexPaths:[NSArray arrayWithObjects:te,nil] withRowAnimation:UITableViewRowAnimationNone];

刷新某section:NSIndexSet * nd=[[NSIndexSet alloc]initWithIndex:1];

[tview reloadSections:nd withRowAnimation:UITableViewRowAnimationAutomatic];

时间器。

创建时间器的时候,在退出本页面的栈堆之前把时间器关掉,节省cpu。当一个页面里需要创建多个时间器,并且是执行相同的方法时,在创建之前先把时间器关掉,否则会出现数据多次获取的情况,尽管你用的时间器是一个全局变量,并且每次创建都是新建,原来的时间器也不会销毁的。

自动释放池。

在ARC语法中,使用@autoreleasepool {}自动释放池可避免内存峰值。因为在自动释放池中,自动释放池会把里面的临时变量放到本池中,而不用放到主池中,每次循环后,自动释放池会把池内的变量清空,然后再创建自动释放池,这样还可以避免已经释放的对象被再次使用。但是也不要乱添加,要测试一下,确实需要避免内存峰值时再创建,因为就算自动释放池的消耗很低,但还是存在的。

调试内存管理问题(有时崩,有时不崩的情况)

Product->Screem-Edit Screem->Run->Diagnostics->Enable Zombie Objects调出僵尸对象进行调试

快速枚举

遍历数组时,使用快速枚举for(id obj in array){};

如果需要知道下标,则使用基于块的快速枚举[indexArray enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {

//dosomething with obj and idx

if(){//符合条件时停止,相当于break

*stop=YES;

}

}];

遍历字典时,使用基于块的快速枚举,可以同时获得key和value

[dic enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {

// dosomething with key and obj

if(){//符合条件时停止,相当于break

*stop=YES;
}


}];

如果知道了具体类型,则可使用具体的oc类型代替id类型。

延迟加载或添加

使用scrollview时,当不需要显示的页面和数据,可使用延迟加载,在即将需要使用的时候才加载,而不是一开始就全部加载。在做一些需要点击某个按钮后才会出现的页面,也使用延迟加载,在点击的时候才布局,当然不是每次都新建,而是判断为nil时新建,不为nil时显示。

当你需要点击self.view收起键盘时,不需要为self.view添加一个单击手势,然后再在手势方法里面一个个地resignFirstResponder了,只需要用到控制器自带的一个方法即可

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
[self.view endEditing:YES];
}


待续……….
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  iOS 进阶