美文网首页
iOS -- ARC (18)

iOS -- ARC (18)

作者: dingzhijie | 来源:发表于2017-10-09 16:44 被阅读0次

    以 ARC 简化引用计数

    引用计数这个概念相当容易理解,需要执行保留与释放操作的地方也很容易就能看出来. 所以 Clang 编译器项目带有一个 '静态分析器',用于指明程序中引用计数出问题的地方, 静态分析器还有更为深入的用途, 既然可以查明内存管理问题, 那么应该也可以根据需要,预先加入适当的保留或释放操作以避免这些问题, 自动引用计数这一思路正是源于此,

    于此,自动引用计数所做的事情与其命名相符, 就是自动管理引用计数.

    使用 ARC 时一定要注意, 引用计数实际上还是要执行的, 只不过保留与释放操作现在是由 ARC 自动为你添加,

    由于 ARC 会自动执行 retain,release ,autorelease 等操作, 所以直接在 ARC 环境下调用这些内存管理方法是非法的,具体来说, 不能调用下列方法: retain,release,autorelease,dealloc.

    直接调用上述任何方法都会产生编译错误, 因为 ARC 要分析何处应该自动调用内存管理方法, 所以如果手工调用的话, 就会干扰其工作, 此时必须信赖 ARC,令其帮你正确的处理内存管理,而这会使那些惯于手动管理引用计数的开发者不太放心,.

    实际上,ARC 在调用这些方法时,并不会通过普通的 OC 消息派发机制,而是直接调用其底层的 C语言版本, 这样性能更好, 因为 保留及释放操作需要频繁执行, 所以直接调用其底层函数能节省很多 CPU 周期, 比方说, ARC 会调用与 retain 等价的底层函数 objc_retain ,这也是补不能覆盖 retain,release 等的缘由,因为这些方法从来不会被直接调用.

    在应用程序中, 可用下列修饰符来改变局部变量 与 实例变量的语义:

    __strong: 默认语义, 保留此值,

    __unsafe_unretaubed: 不保留此值, 那么做可能不安全, 因为等到再次使用变量时, 其对象可能已经回收了.

    __weak: 不保留此值, 但是变量可以安全使用, 因为如果系统把这个对象回收了, 那么变量也会自动清空.

    __autoreleasing: 把对象 '按引用传递 给方法时',使用这个特殊的修饰符,此值在方法返回时自动释放.

    我们经常会给局部变量加上修饰符, 用以打破由 '块'(block) 所引入的'保留环', 块会自动保留其所捕获的全部对象, 而如果这其中有某个对象又保留了 '块' 本身, 那么久可能导致死循环(保留环), 可以用 __weak 局部变量来打破这种 '保留环'.

    ARC 如何清理实例变量

    ARC 也负责对实例变量进行内存管理, 要管理内存, ARC 就必须在 '回收分配给对象的内存'时生成必要的清理代码, 凡是具备强引用的变量,都必须释放,ARC 会在 dealloc 方法中插入这些代码

    不过,如果有非 OC 的对象, 比如 CoreFoundation 中的对象或是 malloc()分配在对堆中的内存, 那么仍然需要清理, 然而不需要像原来那样用超类的 dealloc 方法, 前文说过, 在 ARC 下不能直接调用 dealloc,ARC 会自动在 _cxx_destruct 方法中生成代码并运行此方法, 未在生成的代码中会自动调用超类的 dealloc 方法, ARC 环境下, dealloc 方法可以像这样写:

    - (void)dealloc{

    CFRelease(_coreFoundationObject);

    free(_heapAllocateMemoryBlob);

    }

    总结:

    有 ARC 之后,程序猿就无需担心内存管理问题了. 使用 ARC 来编程, 可省去类中的许多'样板代码',

    ARC 管理对象生命周期的办法基本上就是:在合适的地方插入'保留'及'释放'操作,在 ARC 环境下,变量的内存管理语义尅通过修饰符指明, 而原来则需要手工执行.

    由方法所返回的对象,其内存管理语义总是通过方法名来实现.

    ARC 只负责管理 OC 对象的内存, 尤其要注意的是, CoreFondation 对象不归 ARC 管理, 开发者必须适时调用 CFRetain/CFRelease.

    相关文章

      网友评论

          本文标题:iOS -- ARC (18)

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