1. 正确使用reuseIdentifier 2. 不要阻塞主线程 3. 重用和延迟加载Views 4. 缓存不容易修改且利用率高的资源 5. 重用开销大的对象 6. 选择正确的方式加载本地图片 7. 使用WKWebView替代UIWebView 8. UITableView 性能优化 9. 处理内存警告 10. 用户体验提高
1. 正确使用reuseIdentifierweb
//1. 注册(Cell 为纯代码) [tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"UITableViewCell_Reuse"]; //2. 注册(Cell 包含Nib 文件) [tableView registerNib:[UINib nibWithNibName:@"TalkCell" bundle:nil] forCellReuseIdentifier:@"TalkCell_Reuse"]; // 根据reuseIdentifier获取 [tableView dequeueReusableCellWithIdentifier:@"TalkCell_Reuse" forIndexPath:indexPath];
// 注册 [tableView registerClass:[UITableViewHeaderFooterView class] forHeaderFooterViewReuseIdentifier:@"UITableViewHeaderFooterView_Reuse"]; // 根据reuseIdentifier获取 [tableView dequeueReusableHeaderFooterViewWithIdentifier:@"UITableViewHeaderFooterView_Reuse"];
2. 不要阻塞主线程数据库
主线程负责UI更新,渲染,用户交互处理等事件,为了避免阻塞主线程,除此以外的一些复杂和耗时的操做必须放在子线程中去执行。常见的如获取网络资源。缓存
//阻塞主线程 NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://www.baiu.com"]]; //解决方案 dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://www.baiu.com"]]; });
3. 重用和延迟加载(lazy load)Views性能优化
更多的view意味着更多的渲染,也就是更多的CPU和内存消耗,对于那种嵌套了不少view在UIScrollView里边的app更是如此。服务器
4. 缓存不容易修改且利用率高的资源微信
一个极好的原则就是,缓存所须要的,也就是那些不大可能改变可是须要常常读取的东西。
咱们能缓存些什么呢?一些选项是,远端服务器的响应,图片,甚至计算结果。网络
5. 重用开销大的对象数据结构
一些对象的初始化很慢,好比NSDateFormatter和NSCalendar。然而,你又不可避免地须要使用它们。那么能够把它做为一个属性或者是单例来使用。但做为单例会一直占用内存。app
6. 选择正确的方式加载本地图片框架
[UIImage imageNamed:@"hello.png"];特色:这个方法用一个指定的名字在系统缓存中查找并返回一个图片对象若是它存在的话。若是缓存中没有找到相应的图片,这个方法从指定的文档中加载而后缓存并返回这个对象。
//图片路径 NSString *path = [[NSBundle mainBundle]pathForAuxiliaryExecutable:@"hello.png"]; //根据路径加载图片 [UIImage imageWithContentsOfFile:path];特色:每次都是找到对应路径的图片以后再加载图片,无缓存。
7. 使用WKWebView替代UIWebView
iOS8之后,苹果推出了新框架Wekkit,提供了替换UIWebView的组件WKWebView。各类UIWebView的问题没有了,速度更快了,占用内存少了,一句话,WKWebView是App内部加载网页的最佳选择!
8. UITableView 性能优化
9. 处理内存警告
一旦系统内存太低,iOS会通知全部运行中app。在官方文档中是这样记述:
若是你的app收到了内存警告,它就须要尽量释放更多的内存。最佳方式是移除对缓存,以及一切可再生资源.
幸运的是,UIKit提供了几种收集低内存警告的方法:
10. 用户体验提高
本地缓存一些用户常常浏览的数据,实现离线浏览功能,如微信的朋友圈,微博的首页等。
NSUserDefaults只适用于小数据,好比一些简单的布尔型的设置选项。
Plist文件只支持一些简单的系统类,如NSDictionary,NSArray,NSString等。其余类就不能用此方法。
NSCoding它须要读写文件,当储存大块数据或者要支持查询部分数据,它就没有任何优点了。
当存储大块数据时,以上的方法都不适用. 在这种应用场景下,使用SQLite 或者 Core Data比较好。使用这些技术你用特定的查询语句就能只加载你须要的对象。 SQLite是iOS内嵌的数据库,使用C语言的,用SQL语句进行数据操做。 CoreData基于SQLite封装,OC语言,底层存储数据的依然是SQLite。