一、入门级
1. 用ARC管理内存
2.在正确的地方使用reuse Identifier
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
3.尽可能的使Views不透明
如果你有不透明的Views,你应该设置它们的opaque属性为YES。系统会以最优的方式渲染这个view;
目标就是,能设为opaque的就全设为opaque!
4.避免庞大的XIB
当你加载一个XIB的时候所有内容都被放在了内存里,包括任何图片。如果有一个不会即刻用到的view,你这就是在浪费宝贵的内存资源了。Storyboards就是另一码事儿了,storyboard仅在需要时实例化一个view controller.
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
});
});
6.在ImageViews中调整图片大小
如果要在`UIImageView`中显示一个来自bundle的图片,你应保证图片的大小和UIImageView的大小相同。在运行中缩放图片是很耗费资源的,特别是`UIImageView`嵌套在`UIScrollView`中的情况下。
如果图片是从远端服务加载的你不能控制图片大小,比如在下载前调整到合适大小的话,你可以在下载完成后,最好是用background thread,缩放一次,然后在UIImageView中使用缩放后的图片。
7.选择正确的Collection
Arrays:有序的一组值。使用index来lookup很快,使用value lookup很慢,插入/删除很慢。
Dictionaries:存储键值对。用键来查找比较快。
Sets:无序的一组值。用值来查找很快,插入/删除很快。
8.打开gzip压缩
减小文档的一个方式就是在服务端和你的app中打开gzip。这对于文字这种能有更高压缩率的数据来说会有更显著的效用。
iOS已经在NSURLConnection中默认支持了gzip压缩,当然AFNetworking这些基于它的框架亦然。像Google App Engine这些云服务提供者也已经支持了压缩输出。
二、中级(相对复杂的情况下会用到)
1.重用和延迟加载Views
A.创建并隐藏这个view当这个screen加载的时候,当需要时显示它;
B.当需要时才创建并展示。
2.Cache
原则:缓存所需要的,也就是那些不大可能改变但是需要经常读取的东西。
3.权衡渲染方法
CoreGraphics
OpenGL
CALayer
4.处理内存警告
UIKit提供了几种收集低内存警告的方法:
在app delegate中使用`applicationDidReceiveMemoryWarning:` 的方法
在你的自定义UIViewController的子类(subclass)中覆盖`didReceiveMemoryWarning`
注册并接收 UIApplicationDidReceiveMemoryWarningNotification 的通知
5.重用大开销的对象
一些objects的初始化很慢,比如NSDateFormatter和NSCalendar。然而,你又不可避免地需要使用它们,比如从JSON或者XML中解析数据。
想要避免使用这个对象的瓶颈你就需要重用他们,可以通过添加属性到你的class里或者创建静态变量来实现。
注意如果你要选择第二种方法,对象会在你的app运行时一直存在于内存中,和单例(singleton)很相似。
下面的代码说明了使用一个属性来延迟加载一个date formatter. 第一次调用时它会创建一个新的实例,以后的调用则将返回已经创建的实例:
// in your .h or inside a class extension
@property (nonatomic, strong) NSDateFormatter *formatter;
// inside the implementation (.m)
// When you need, just use self.formatter
- (NSDateFormatter *)formatter {
if(! _formatter) {
_formatter = [[NSDateFormatter alloc] init];
_formatter.dateFormat = @"EEE MMM dd HH:mm:ss Z yyyy";// twitter date format
}
return_formatter;
}
6.使用Sprite Sheet(动画)
针对游戏开发
7.避免反复处理数据
8.正确的设定Background Images
9.减少使用Web特性
10.设定Shadow Path(离屏渲染相关)
[myView.layer setShadowPath:[[UIBezierPathbezierPathWithRect:myView.bounds] CGPath];
11.UItableView的优化
为了保证table view平滑滚动,确保你采取了以下的措施:
正确使用`reuseIdentifier`来重用cells
尽量使所有的view opaque,包括cell自身
避免渐变,图片缩放,后台选人
缓存行高
如果cell内现实的内容来自web,使用异步加载,缓存请求结果
使用`shadowPath`来画阴影
减少subviews的数量
尽量不适用`cellForRowAtIndexPath:`,如果你需要用到它,只用一次然后缓存结果
使用正确的数据结构来存储数据
使用`rowHeight`, `sectionFooterHeight` 和 `sectionHeaderHeight`来设定固定的高,不要请求delegate
12.正确的选择数据存储选项
三、进阶篇(这些建议只应该在你确信他们可以解决问题和得心应手的情况下采用)
1.加速启动时间
2.使用Autorelease Pool
NSArray *urls = ;
for(NSURL *urlinurls) {
@autoreleasepool {
NSError *error;
NSString *fileContents = [NSString stringWithContentsOfURL:url
encoding:NSUTF8StringEncoding error:&error];
/* Process the string, creating and autoreleasing more objects. */
}
}
3.选择是否缓存图片
imageWithNamed 会缓存图片
imageWithContentOfFile 一次
4.尽量避免日期格式转换
- (NSDate*)dateFromUnixTimestamp:(NSTimeInterval)timestamp {
return[NSDate dateWithTimeIntervalSince1970:timestamp];
}
原文地址:http://blog.jobbole.com/37984/
iOS开发遇到问题欢迎前来留言,一定尽心尽力帮忙解答!!!