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中少进行操作。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,475评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,019评论 4 62
  • WebSocket-Swift Starscream的使用 WebSocket 是 HTML5 一种新的协议。它实...
    香橙柚子阅读 23,713评论 8 183
  • 为了把孩子教育成一个有担当的人,父母既应该让孩子了解父辈的辛苦,激发孩子的责任意识,同时还要放手让孩子去承...
    我爱无花果阅读 1,192评论 0 0
  • 今天被塞了满满的狗粮,多想你在我身边,然后跟她们说,这是我媳妇。 恋爱的纪念物, 从来就不是那些你送给我的手表和项...
    画澜阅读 105评论 2 3