OC优化指南

  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中少进行操作。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏你不就像风一样

网络爬虫之Url含有中文如何转码

1052
来自专栏公有云大数据平台弹性 MapReduce

yarn公平调度详细分析(一)

FairScheduler是yarn常用的调度器,但是仅仅参考官方文档,有很多参数和概念文档里没有详细说明,但是这些参明显会影响到集群的正常运行。本文的主要目的...

1.4K17
来自专栏向治洪

Android App瘦身实战

随着业务的快速迭代增长,不断引入新的业务逻辑代码、图片资源和第三方SDK等,很多app都面临一个一个结果,app越来越大,甚至很多无用的代码,包体积的增大带来了...

3688
来自专栏web开发

使用jOrgChart插件实现组织架构图的展示

项目要做组织架构图,要把它做成自上而下的树形结构。 一、说明 (1)通过后台查询数据库,生成树形数组结构,返回到前台。 (2)需要引入的js插件和css文件: ...

30810
来自专栏前端

使用jOrgChart插件实现组织架构图的展示

(3)使用jOrgChart插件,根据返回的数据将其子节点加入到相应的<li></li>中。

8655
来自专栏点滴积累

Cesium中Clock控件及时间序列瓦片动态加载

前言 前面已经写了两篇博客介绍Cesium,一篇整体上简单介绍了Cesium如何上手,还有一篇介绍了如何将Cesium与分布式地理信息处理框架Geotrelli...

4354
来自专栏24K纯开源

用Qt写软件系列一:QCacheViewer(浏览器缓存查看器)

介绍      Cache技术广泛应用于计算机行业的软硬件领域。该技术既是人们对新技术探讨的结果,也是对当前软硬件计算能力的一种妥协。在浏览器中使用cache技...

2505
来自专栏美团技术团队

Android Hook技术防范漫谈

背景 当下,数据就像水、电、空气一样无处不在,说它是“21世纪的生产资料”一点都不夸张,由此带来的是,各行业对于数据的争夺热火朝天。随着互联网和数据的思维深入人...

5627
来自专栏有趣的django

一个完整的Django入门指南(三)

第五部分  Introduction Welcome to the 5th part of the tutorial series! In this tutor...

4887
来自专栏移动端开发

iOS ReactiveCocoa(RAC)学习详解

概述:     ReactiveCocoa(简称为RAC),是由Github开源的一个应用于iOS和OS开发的一个框架,有时间,自己也了解学习了一下这个框架的一...

2686

扫码关注云+社区

领取腾讯云代金券