提升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
There are only two hard problems in Computer Science: cache invalidation and naming things. ------Phil Karlton
iOS的存储中需要注意的:
a) temporary Directory
优点:在iOS某些时间点会被删除。而且重启iOS设备时也会被删除,因此不需要考虑清除机制
缺点:不可控
作用:存储一些快速或者临时的文件
b) cache directory
优点:不会被备份;不会被iOS系统删除
缺点:要注意清除缓存的机制
作用:存储缓存文件,比如image、video等等
c) documents directory
优点:会被备份。不会被OS删除
缺点:需要自己考虑清除缓存的策略,确保目录不会太大
作用:如果希望app部分内容被备份时使用
Hashing方法被NSSet和NSDictionary来实现。如果想要处理很多唯一数据的集合,并且要进行合并、交集、子集等等操作,NSSet是最佳选择
SAX/DOM:
a) 通过SAX来解析XML非常快。问题就是如果要查找特定片段非常复杂。
b) DOM正相反,它获取数据内容非常快速,但是相比SAX,存储数据结构要花费更多时间和空间。
多线程的优点:
a) 充分利用所有cpu。
b) Modeling
c) 处理I/O的任务。因为一般的,I/O需要时间,多线程解决这个问题
d) UI能及时响应。
e) 使得某些逻辑过程在后台执行
多线程的隐患:
a) 不能控制现场执行的顺序。而且需要格外注意以下三个问题:
b) 安全性。确保顺序的不确定性不会带来程序的错误
c) 活性。(Liveness),确保不会发生资源死锁的问题。可以通过NSLock或者NSCondition来实现
d) 性能。
判断一个计算过程是否应该单独开一个线程,需要看此计算是否是CPU-bound(限制)或者I/O-bound(限制) 任务
a) CPU-Bound:任务会让cpu buzy。分为复杂算法
和扫描大字符串
b) I/O-Bound:时间花费在等待从其它source获取数据上。
当CPU需要从一个现场切换到另一个线程是,需要话费时间和资源。因此,需要考虑切换成本,如果频繁切换线程则CPU会完成任务的时间会更长。
- 以下类是线程安全的:NSArray,NSConnection,NSData,NSDictionary,NSNumber,NSObject,NSSet,NSString
- 以下类,一般是mutable,是线程不安全的:NSMutableArray,NSMutableAttributesString,NSMutableCharacterSet,
NSMutableData,NSMutableDictioanry,NSMutableSet,NSMutableString - Idle-Time通知:NSPostWhenIdle
- ARC下不能使用NSAutoreleasePool对象,必须使用@autoreleasepool
- Unsafe_unretained:和weak相似,不同在于如果Object B被ObjectA引用,一旦B被dealloc,reference被指向一个dealocated 对象,而非nil,会导致程序crash
- 使用__weak或者__unsafe_unretained。因为如果对象没有strong 引用,对象会马上被dealloc掉。
- LoadingView Process:VC initials –> Ask for View à Load View à view did load
- Unload View Process: Memory warning à iOS informs vc à didReceive Memory Warning à viewDidUnload
- 当重载load方法,如init,loadView,viewDidLoad等等,super方法要先调用;然而,如果重载clean方法,如didReceiveMemorywarning ,viewDidUnload ,dealloc等等,super方法租后调用。
- 在viewDidUnload中,仅仅clean所有views。其它对象应该在didReceiveMemoryWarning里进行清除。
- ViewwillAppear,应该在此处设置attributes
- 浅copy与retain无区别;深copy是创建一个新的对象
- 当创建一个新的autorelease pool的时候,它会被push到栈顶,此时所有autoreleased的变量都会被push到那个新的autorelease pool中。
- applicationWillTerminate:/UIApplicationWillTerminateNotification,这对代理/通知可以在os将app从内存中remove时激发,此时应该去保存未保存的data。
- applicationDidBecomeActive:总是会被激活,不论是第一次启动app还是从后台切到前台;与此不同的是,applicationDidFinishLauching:只在第一次启动时进行激活。applicationWillEnterForeground是当app从后台切换回来时激活的。
- 如何进制app的后台运行:
a) 打开对应的plist
b) 添加Key UIApplicationExitsOnSuspend 或者选择 Application does not run in background - iOS规定允许后台运行的app类型:Audio、Privacy(比如带有银行帐号的app,可以控制其不被显示)、Location、VOIP、Local Notification、Task Completion等
- Splash Screen:当app切入后台,iOS环境会对当前app进行截图,切回环境时先显示图片,以降低app的延迟感。
- 当app消耗完内存时,iOS将会发现占内存最多的app并kill掉它。因此为了减少app的内存消耗,应当经常清除cache,尤其是图片。
- 当app在后台时,请确保:
a) 没有OpenGL ES调用
b) 没有任何Bonjour相关的服务
c) 处理相关网络请求或者网络失败
d) 更新window或者view,因为用户看不见,更新了也没用
e) 清除任何alert或者pop up message
f) 进行在background中少进行操作。