1. 避免内存泄漏
① 避免对象之间循环引用(代理一定要弱引用)
② block 中对象的循环引用、添加的通知在销毁的时候移除监听
③ NSTimer 销毁的时候要从runLoop中移除掉
④ C 语言库的以 create、alloc 或者 copy 创建出来的结构体 记得即时release
2. 视图view优化
① 重用和延迟加载(lazy load)Views
模仿`UITableView`和`UICollectionView`的操作:不要一次创建所有的subview,而是当需要时才创建,当它们完成了使命,把他们放进一个可重用的队列中。
② 避免使用过于庞大的XIB
当你加载一个XIB的时候所有内容都被放在了内存里,包括任何图片。如果有一个不会即刻用到的view,你这就是在浪费宝贵的内存资源了当你加载一个引用了图片或者声音资源的nib时,nib加载代码会把图片和声音文件写进内存。在OS X中,图片和声音资源被缓存在named cache中以便将来用到时获取。在iOS中,仅图片资源会被存进named caches。
③ 避免约束滥用,尽量使用frame控制视图的位置,使用frame还可以提升性能
④ 视图view和layer 选择
view和layer的主要区别在于view是有点击事件,而layer是没有点击事件不需要事件响应的视图可以使用layer代替,而且layer的动画比view的动画更加流畅(layer动画是在后台线程处理)
3. 图片优化
① 在Image Views中调整图片大小如果要在`UIImageView`中显示一个来自bundle的图片,你应保证图片的大小和UIImageView的大小相同。在运行中缩放图片是很耗费资源的,特别是`UIImageView`嵌套在`UIScrollView`中的情况下。如果图片是从远端服务加载的你不能控制图片大小,比如在下载前调整到合适大小的话,你可以在下载完成后,最好是用子线程缩放一次,然后在UIImageView中使用缩放后的图片。
② `imageNamed` 和`imageWithContentsOfFile`
如果你要加载一个大图片而且是一次性使用,那么就没必要缓存这个图片,用`imageWithContentsOfFile`足矣,这样不会浪费内存来缓存它。然而,在图片反复重用的情况下`imageNamed`是一个好得多的选择。
4. 使用Autorelease Pool
堆栈调用层级较深(如循环、递归)过久导致一些栈底局部变量长时间持有,使用Autorelease 可以提前释放一些不要的局部变量
5. 正确的使用Cache (二级缓存)
那些不大可能改变但是需要经常读取的东西,比如远端服务器的响应,图片,甚至计算结果(如UITableView的行高)你可以用NSCache 。NSCache和NSDictionary类似,不同的是系统回收内存的时候它会自动删掉它的内容。
6. 减少一些工具类使用,尽量使用分类、或者使用C函数
项目中一些无用的类不要参与编译,类本身就是一个类对象需要开销同时也可以给app瘦身;一些快速构造或者可以getter性的方法可以使用分类,计算性的或者跟对象扯不上关系一些方法 可以采用C函数代替,OC面向对象的本质还是C/C++的一个封装
7. 处理内存警告
注册并接收 UIApplicationDidReceiveMemoryWarningNotification的通知,一旦收到这类通知,你就需要释放任何不必要的内存使用。 例如,UIViewController的默认行为是移除一些不可见的view,它的一些子类则可以补充这个方法,删掉一些额外的数据结构。一个有图片缓存的app可以移除不在屏幕上显示的图片。