美文网首页
Effective Objective-C 2.0 读书笔记-内

Effective Objective-C 2.0 读书笔记-内

作者: Terry_GoForIt | 来源:发表于2015-08-28 22:53 被阅读0次

    最近大半年开始做iOS开发,看到叶孤城有一些iOS开发的书单推荐,于是买了几本,其中有Effective Objective-C 2.0。之前做Java有看过Effective Java, 感觉写的很不错,对OC版本也有些许期待。可是,等我把OC版看完后,感觉作者实在太啰嗦,一个观点绕来绕去,很折腾。所以,我想要在此写下一系列的读书笔记,把这本书要说的东西浓缩一下。

    Objective-C语言的起源

    objc是基于消息的语言(messaging structure),而不是基于函数调用的语言。基于消息的语言在运行期才会去检查对象类型,以及查找某个消息对应的方法,此过程叫做动态绑定“dynamic binding”

    objc是C语言的超集。写得一手好的objc必须得理解C语言的核心概念,尤其是内存模型。基础类型和结构体类型的变量分配在栈中,在栈帧弹出的时候会被自动清理。对象分配在堆中,必须直接管理。

    内存管理

    和Java/C#等基于虚拟机的语言不同的是,objc使用引用计数器来管理对象,当一个对象没有任何指向它的引用时,会被回收掉;而前者检查某个对象从GC Root出发查找引用是否可达。有了ARC (Automatic Reference Counting)之后,ARC把所有内存管理都交由编译器来管理,ARC会自动在合适的地方插入保留retain(引用加一)和释放release操作(引用减一),开发者只需专注于业务逻辑。

    除了调用释放release操作,还可以用autorelease pool,来管理对象,它调用autorelease方法,将对象加入自动释放池。清空(drain)自动释放池时,系统会向对象发送release消息。autorelease pool可以嵌套,可以使用嵌套autorelease pool来降低内存峰值。

    CoreFoundation中的对象不归ARC管理

    CoreFoundation中的对象需要调用CFRetain和CFRelease来管理。也可以使CoreFoundation中的类无缝桥接(bridging)至Foundation中对应的类,让ARC获得对象所有权。比如各种Collection类,CFArray -> NSArray。

    在CoreFoundation层面创建collection时,可以指定相应的回调函数来控制collection应该如果来处理其中的元素。

    保留环

    虽然,ARC会帮助我们自动释放掉引用数为零的对象,但也要注意不要出现保留环(Retain Cycle),也就是循环引用。如果对象A持有对象B的强引用, B也同时持有A的强引用,那么这两个对象的引用数都不为零,也就无法被回收。

    解决方法,可以将其中的一些强引用变为弱引用,即将环打破。

    使用块(Block),也就是闭包的时候也可能出现保留环,因为闭包会捕捉(capture)所引用的外部变量,很多情况下块会引用所属对象的成员变量活着方法,也就会捕捉所属对象。解决方法有:1. 在合适的时机,解除保留环,即将其中一方持有的引用置为nil;2. 使用__weak局部变量来打破保留环;

    NSTimer会保留其目标(target)对象,直到计时器本身实效为止。repeating timer可能会引入保留环,这种情况和块(Block)类似,持有timer的对象本身也是timer的目标对象,被持有。可以考虑结合使用__weak局部变量和块来解决此问题,或在合适时机解除保留环。

    dealloc方法

    在对象被系统回收的时候,会执行dealloc方法,但调用时间不确定(和Java/C#的finalize,以及析构函数类似),所以在一个类的dealloc方法里,应该只做释放引用,取消订阅的事件(KVO或NSNotificationCenter等通知),不做其他事情。特定的系统资源(比如socket,file descriptor)应该用特定的方法,比如close来释放,以免过久持有特定的资源。

    异步操作也不应该放在dealloc中;只能在正常状态下执行的方法也不应该在dealloc里,因为此时对象处在回收状态。

    @try-catch-finally

    尽量不使用try-catch-finally,考虑使用NSError的模式来替代异常。一方面是因为异常在iOS/Mac的程序里,被认为是在发生非常严重的错误才使用的,另外一方面,对象的回收,在try-catch-finally里,很难被整杯清理干净。

    如果没有ARC,在finally中清理所有的对象。如果有ARC, try块弱发生异常,try块里的对象不能保证被清理干净。打开-fobjc-arc-exceptions标志后,ARC会在try块插入大量对象清理跟踪代码,确保对象能被清理干净,但这会降低运行效率。

    其他

    NSObject中的retainCount不能准确的反应对象的引用数,不建议使用。

    下篇:Effective Objective-C 2.0 读书笔记-Coding Style & API篇

    相关文章

      网友评论

          本文标题:Effective Objective-C 2.0 读书笔记-内

          本文链接:https://www.haomeiwen.com/subject/rtrkcttx.html