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
}];
如果知道了具体类型,则可使用具体的oc类型代替id类型。
延迟加载或添加
使用scrollview时,当不需要显示的页面和数据,可使用延迟加载,在即将需要使用的时候才加载,而不是一开始就全部加载。在做一些需要点击某个按钮后才会出现的页面,也使用延迟加载,在点击的时候才布局,当然不是每次都新建,而是判断为nil时新建,不为nil时显示。
当你需要点击self.view收起键盘时,不需要为self.view添加一个单击手势,然后再在手势方法里面一个个地resignFirstResponder了,只需要用到控制器自带的一个方法即可
待续……….
尽量不要在头文件引入其它的头文件,如果需要用到实例,则用@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]; }
待续……….
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- 讲解iOS开发中基本的定位功能实现
- iOS中定位当前位置坐标及转换为火星坐标的方法
- js判断客户端是iOS还是Android等移动终端的方法
- iOS应用开发中AFNetworking库的常用HTTP操作方法小结
- iOS应用中UISearchDisplayController搜索效果的用法
- IOS开发环境windows化攻略
- iOS应用中UITableView左滑自定义选项及批量删除的实现
- iOS中UIAlertView警告框组件的使用教程
- 浅析iOS应用开发中线程间的通信与线程安全问题
- System.Web.Routing入门及进阶
- System.Web.Routing入门及进阶
- 检测iOS设备是否越狱的方法
- .net平台推送ios消息的实现方法