代码性能优化:
入门级(这是些你一定会经常用在你app开发中的建议)
1. 用ARC管理内存
项目中目前正在使用
2. 在正确的地方使用reuseIdentifier
UITableView和UICollectionView使用时要注意单元格重用
3. 尽可能使Views不透明
将视图的opaque属性为YES,目前项目中设置没有问题。
4. 避免庞大的XIB
Storyboards在单个人开发非常便利,但是不适合我们项目,否则所有时间都用来解决SVN冲突了。
我们项目中借鉴:一些简单界面可以不使用XIB,例如:一个XIB中只有一个UITableView的情景,可以不创建XIB。
5. 不要block主线程
目前我们项目中一些复杂的数据处理及计算都直接处理,要多多使用如下模式:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// switch to a background thread and perform your expensive operation
dispatch_async(dispatch_get_main_queue(), ^{
// switch back to the main thread to update your UI
});
});
- 在Image Views中调整图片大小
使用合适大小的图片资源 - 选择正确的Collection
- 打开gzip压缩
使用gzip来减少与服务器间数据量,可以做技术储备
中级(这些是你可能在一些相对复杂情况下可能用到的) - 重用和延迟加载Views
- Cache, Cache, 还是Cache!
- 权衡渲染方法
- 处理内存警告
目前项目中几乎没有针对内存警告的处理,原因是目前暂时还没有发现因为内存警告而导致的Crash。要引起重视。内存警告时解决方案:将缓存删掉,同时要注意将上次选择的状态保存在本地 - 重用大开销的对象
理论没有问题。但是NSDateFormatter示例不合适,因为NSDateFormatter不是线程安全的,多个线程同时访问NSDateFormatter会Crash,我个人建议特殊情况特殊处理,对于NSDateFormatter这种不是线程安全的,应该随时使用随时创建。 - 使用Sprite Sheets
目前项目没有涉及游戏方面。 - 避免反复处理数据
从服务器拿到数据以后,一次性处理好,然后展示。最好不要在展示的时候才处理数据。 - 选择正确的数据格式
目前我们项目中使用Json解析,没有问题。 - 正确地设定Background Images
使用UIColor的colorWithPatternImage也可以设定背景图片,但是一定注意,colorWithPatternImage只使用一种情况:用小图平铺来创建背景,否则内存会急剧增大 - 减少使用Web特性
项目中暂不涉及 - 设定Shadow Path
设置阴影一定要加shadowPath,避免卡成狗
view.layer.shadowPath = [[UIBezierPath bezierPathWithRect:view.bounds] CGPath];
- 优化你的Table View
• 正确使用reuseIdentifier
来重用cells
• 尽量使所有的view opaque,包括cell自身
• 避免渐变,图片缩放,后台选人
• 缓存行高
• 如果cell内现实的内容来自web,使用异步加载,缓存请求结果
• 使用shadowPath
来画阴影
• 减少subviews的数量
• 尽量不使用cellForRowAtIndexPath:
,如果你需要用到它,只用一次然后缓存结果
• 使用正确的数据结构来存储数据
• 使用rowHeight
,sectionFooterHeight
和sectionHeaderHeight
来设定固定的高,不要请求delegate
额,说的非常正确,我不知道说什么好。 - 选择正确的数据存储选项
进阶级(这些建议只应该在你确信他们可以解决问题和得心应手的情况下采用) - 加速启动时间
程序启动时,除了界面上的操作,其他尽可能放在背景线程做。
“避免过于庞大的XIB,因为他们是在主线程上加载的。所以尽量使用没有这个问题的Storyboards吧!” 这句虽然说的对,但是不适合我们项目 - 使用Autorelease Pool
在循环中,如果有很多autorelease对象,使用如下方案。注意@autoreleasepool要放在循环内部。
NSArray *urls = ;
for (NSURL *url in urls) {
@autoreleasepool {
NSError *error;
NSString *fileContents = [NSString stringWithContentsOfURL:url
encoding:NSUTF8StringEncoding error:&error];
/* Process the string, creating and autoreleasing more objects. */
}
}
- 选择是否缓存图片
一次性大图片使用imageWithContentsOfFile加载,表格中或者反复使用的图片可以使用imageNamed。 - 尽量避免日期格式转换
NSDateFormatter仍然是坑