美文网首页
ARC规则-规则

ARC规则-规则

作者: 关灯侠 | 来源:发表于2018-09-15 20:52 被阅读14次

    所有内容引用自《Objective-C 高级编程 iOS与OS X多线程和内存管理》,加入了自己的部分理解。

    本节小结,点小1跳到底部[1]


    • 不能使用retain/release/retainCount/autorelease
    • 不能使用NSAllocateObject/NSDeallocateObject
    • 须遵守内存管理的方法命令规则
    • 不要显示调用dealloc
    • 使用@autoreleasepool块替代NSAutoreleasePool
    • 不能使用区域(NSZone)
    • 对象型变量不能作为C语言结构体(struct/union)的成员
    • 显示转换idvoid *
    部分解释
    对象型变量不能作为C语言结构体(struct/union)的成员

    例如这样就是不允许的

    struct Data{
        NSArray *array;
    };
    

    原因: C语言没有方法管理结构体成员的生存周期。
    ARC环境中编译器管理内存,必须知道对象的生命周期。但C结构体不在管理范围内,所以不能直接使用。

    可加上__unsafe_unretained修饰,让变量不属于编译器管理的对象。需要自己管理,注意内存泄露。

    显示转换id和void*

    如果转换?(为啥要转换?还不知道)

    id obj = [[NSObject alloc] init];
    void *p = (__bridge void *)obj;
    id o = (__bridge id)p;
    

    注: __bridge void *这种转换跟__unsafe_unretained一样不安全,容易产生悬垂指针导致crash

    __bridge_retained 相当于 retain
    __bridge_transfer 相当于 release

    为啥要转换? 因为Objective-CCore Foundation对象之间相互变换就需要用到。

    Objective-C对象和Core Foundation对象没有区别,ARC无效时,可以用简单的C语言的转换也能实现互换。

    因为转换不需要额外的CPU资源,所以也叫免费桥(Toll-Free Bridge)

    属性

    属性声明的属性与所有权修饰符的对应关系

    属性声明的属性 所有权修饰符
    assign __unsafe_unretained修饰符
    copy __strong修饰符(赋值的是被复制的对象)
    retain __strong修饰符
    strong __strong修饰符
    unsafe_unretained unsafe_unretained修饰符
    weak __weak修饰符

    小结

    主要有一个规则、一个属性对应关系


    1. 😊假装是锚点的脚注

    相关文章

      网友评论

          本文标题:ARC规则-规则

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