1.ARC

作者: 写代码写到人生巅峰 | 来源:发表于2017-05-08 21:01 被阅读0次

    1.编译器特性 编译器完全清楚对象,并能立刻释放那些不再使用的对象(实际还是需要运行时库的帮助)

    2.内存管理的思考方式

    以下arc和非arc都是有效的

      自己生成的对象,自己持有 alloc、new、copy、mutableCopy。
      非自己生成的对象,自己也能持有,使用retain方法可以持有对象。
      不在需要持有的对象,持有者有义务释放 release autorelease使对象超出指定生存范围能自动并正确的释放。
      无法释放非自己持有的对象
    

    3.alloc\retain\release\dealloc

    调用alloc或是retain方法之后,引用计数加1
    调用release之后,引用计数减1
    引用计数为0时,调用dealloc方法废弃对象
    
    GNUStep:在OC对象中存有引用计数这一整数值,能够统一管理内存块与对象用内存块
    Apple: 引用计数记录保存在引用计数表中,引用计数记录存有内存块地址,可以追溯到对象的内存块地址
    
    autorelease使用
    生成并持有NSAutoreleasePool对象
    调用已分配对象的autorelease实例方法
    废弃NSAutoreleasePool对象
    

    4.所有权修饰符

    内存泄露:应当废弃的对象在超出其生命周期后继续存在
    -fno-objc-arc
    
    __strong: id和所有对象类型默认的所有权修饰符 __strong修饰的对象超出其作用域,强引用失效;__strong不仅仅在变量的作用域中,在赋值上也能够正确的管理对象的所有者。
    __weak: 避免循环引用,造成内存泄露。 通过检查附有__weak修饰符的变量是否为nil,可以判断被赋值的对象是否已经废弃,
    __unsafe_unretained:  修饰的变量不属于编译器的内存管理对象; 变量表示的对象
    __autoreleasing 修饰的变量等价于在ARC无效时调用对象的autorelease方法,对象被注册到autoreleasepool。
    

    5.ARC规则

    1.不能使用retain、release、retainCount、autorelease
    2.不能使用NSAllocateObject/NSDeallocateObject
    3.必须遵守内存管理的方法命名规则
    4.不要显式的调用dealloc
    5.使用@autoreleasepoool代替NSAutoreleasepool
    6.不要使用区域
    7.对象变量不能作为C语言结构提的成员
    8.显式转换id和void *

    相关文章

      网友评论

          本文标题:1.ARC

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