首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OC优化指南

OC优化指南

作者头像
nimomeng
发布2018-09-13 14:24:02
7620
发布2018-09-13 14:24:02
举报
  1. 提升UITableView效率的几种思路:

a) Reusing UITableViewCell:利用cellWithTableView:cellIdentifier:nibName: b) Reusing Images/ Cache Data:imageNamed做了个很重要的事情:此方法cache了图片。但是这种方法只能从bundle里取出图片,即,不可以通过此方法从网络下载或者本地加载。其他方法,诸如[UIImage alloc] initWithContentOfFile:]或者 [UIImage alloc] initWithData] 则不会自动cache数据 c) 减少准备时间,在展示前将数据准备就绪 d) 善用DrawRect方法,速度比通过nib读取或者addSubView方法快很多,原因在于drawRect是GPU方法,而GPU方法在渲染或者显示UI时更快。 e) 切记设置自定义View的backgroundColor为white,默认为black f) 如果app有太多的子类或者一个复杂的结构,考虑通过代码来draw,让GPU来加速过程 g) Cache the hight。因为如果计算hight的过程很慢,则会影响tableView的渲染 h) Opaque。如果一个View是透明的,则iOS需要在一个像素上渲染两次或多次,因为一个像素在那时候属于多个view。请设置opaque为YES i) 尽量降低Graphical Effects

  1. There are only two hard problems in Computer Science: cache invalidation and naming things. ------Phil Karlton
  2. iOS的存储中需要注意的:

a) temporary Directory 优点:在iOS某些时间点会被删除。而且重启iOS设备时也会被删除,因此不需要考虑清除机制 缺点:不可控 作用:存储一些快速或者临时的文件 b) cache directory 优点:不会被备份;不会被iOS系统删除 缺点:要注意清除缓存的机制 作用:存储缓存文件,比如image、video等等 c) documents directory 优点:会被备份。不会被OS删除 缺点:需要自己考虑清除缓存的策略,确保目录不会太大 作用:如果希望app部分内容被备份时使用

  1. Hashing方法被NSSet和NSDictionary来实现。如果想要处理很多唯一数据的集合,并且要进行合并、交集、子集等等操作,NSSet是最佳选择
  2. SAX/DOM:

a) 通过SAX来解析XML非常快。问题就是如果要查找特定片段非常复杂。 b) DOM正相反,它获取数据内容非常快速,但是相比SAX,存储数据结构要花费更多时间和空间。

  1. 多线程的优点:

a) 充分利用所有cpu。 b) Modeling c) 处理I/O的任务。因为一般的,I/O需要时间,多线程解决这个问题 d) UI能及时响应。 e) 使得某些逻辑过程在后台执行

  1. 多线程的隐患:

a) 不能控制现场执行的顺序。而且需要格外注意以下三个问题: b) 安全性。确保顺序的不确定性不会带来程序的错误 c) 活性。(Liveness),确保不会发生资源死锁的问题。可以通过NSLock或者NSCondition来实现 d) 性能。

  1. 判断一个计算过程是否应该单独开一个线程,需要看此计算是否是CPU-bound(限制)或者I/O-bound(限制) 任务

a) CPU-Bound:任务会让cpu buzy。分为复杂算法扫描大字符串 b) I/O-Bound:时间花费在等待从其它source获取数据上。

  1. 当CPU需要从一个现场切换到另一个线程是,需要话费时间和资源。因此,需要考虑切换成本,如果频繁切换线程则CPU会完成任务的时间会更长。
  2. 以下类是线程安全的:NSArray,NSConnection,NSData,NSDictionary,NSNumber,NSObject,NSSet,NSString
  3. 以下类,一般是mutable,是线程不安全的:NSMutableArray,NSMutableAttributesString,NSMutableCharacterSet, NSMutableData,NSMutableDictioanry,NSMutableSet,NSMutableString
  4. Idle-Time通知:NSPostWhenIdle
  5. ARC下不能使用NSAutoreleasePool对象,必须使用@autoreleasepool
  6. Unsafe_unretained:和weak相似,不同在于如果Object B被ObjectA引用,一旦B被dealloc,reference被指向一个dealocated 对象,而非nil,会导致程序crash
  7. 使用__weak或者__unsafe_unretained。因为如果对象没有strong 引用,对象会马上被dealloc掉。
  8. LoadingView Process:VC initials –> Ask for View à Load View à view did load
  9. Unload View Process: Memory warning à iOS informs vc à didReceive Memory Warning à viewDidUnload
  10. 当重载load方法,如init,loadView,viewDidLoad等等,super方法要先调用;然而,如果重载clean方法,如didReceiveMemorywarning ,viewDidUnload ,dealloc等等,super方法租后调用。
  11. 在viewDidUnload中,仅仅clean所有views。其它对象应该在didReceiveMemoryWarning里进行清除。
  12. ViewwillAppear,应该在此处设置attributes
  13. 浅copy与retain无区别;深copy是创建一个新的对象
  14. 当创建一个新的autorelease pool的时候,它会被push到栈顶,此时所有autoreleased的变量都会被push到那个新的autorelease pool中。
  15. applicationWillTerminate:/UIApplicationWillTerminateNotification,这对代理/通知可以在os将app从内存中remove时激发,此时应该去保存未保存的data。
  16. applicationDidBecomeActive:总是会被激活,不论是第一次启动app还是从后台切到前台;与此不同的是,applicationDidFinishLauching:只在第一次启动时进行激活。applicationWillEnterForeground是当app从后台切换回来时激活的。
  17. 如何进制app的后台运行: a) 打开对应的plist b) 添加Key UIApplicationExitsOnSuspend 或者选择 Application does not run in background
  18. iOS规定允许后台运行的app类型:Audio、Privacy(比如带有银行帐号的app,可以控制其不被显示)、Location、VOIP、Local Notification、Task Completion等
  19. Splash Screen:当app切入后台,iOS环境会对当前app进行截图,切回环境时先显示图片,以降低app的延迟感。
  20. 当app消耗完内存时,iOS将会发现占内存最多的app并kill掉它。因此为了减少app的内存消耗,应当经常清除cache,尤其是图片。
  21. 当app在后台时,请确保: a) 没有OpenGL ES调用 b) 没有任何Bonjour相关的服务 c) 处理相关网络请求或者网络失败 d) 更新window或者view,因为用户看不见,更新了也没用 e) 清除任何alert或者pop up message f) 进行在background中少进行操作。
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016.06.26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档