美文网首页
内存管理 - ARC规则

内存管理 - ARC规则

作者: 呉囲仌犮yzx | 来源:发表于2018-04-24 10:01 被阅读14次

    ARC有效时,所有权修饰符一共有4种:

    * __strong 修饰符

    * __weak 修饰符

    * __unsafe_unretained 修饰符

    * __autoreleaseing 修饰符

    __strong 修饰符

    __strong修饰符是id 类型和对象类型磨人的所有权修饰符。 id obj = [[NSObject alloc] init];  此时的id变量已经被附加了所有权修饰符。

    id 和对象在没有指定所有权修饰符时,默认使用__strong 修饰符。                 如 id _strong obj = [[NSObject alloc] init];

    如“strong”这个名称所示,__strong 修饰符表示对对象的“强引用”。

    {

      id __strong test =  [[Test alloc] init];

    /** test 持有 Test 对象的强引用*/

    [test setObject: [[NSObject alloc] init]];

    /** test 对象的objc_ 成员,持有 NSObject 对象的强引用。*/

    }

    /**因为test 变量超出其作用于,强引用失效,所以自动释放test 对象。

         *Test对象的所有者不存在,因此废弃该对象。

         *废弃test对象的同时,Test 对象的 obj_ 成员也被废弃,NSObject 对象的强引用失效,自动释放NSObject 对象。

       *NSObject 对象的所有者不存在,因此废弃该对象。*/

    因为 id 类型和 对象类型的所有权修饰符都默认为 __strong 修饰符,所以不需要写上 "__strong"。

    __weak修饰符

    解决引用计数式内存管理中的“循环引用”问题。

    使用 __weak 修饰符可避免循环引用。__weak 修饰符提供的是弱引用,弱引用不能持有对象实例。

    循环引用容易发生内存泄漏。所谓内存泄漏就是应当废弃的对象在超出其生存周期后继续存在。

    附有__strong 修饰符 、 __weak修饰符的变量类似于C++中的只能指针 std::shared_ptr 和 std::weak_ptr。 std::shared_ptr 可通过引用计数来持有C++类实例,std::weak_ptr 可避免循环引用。

    规则

    * 不能使用 retain/release/retainCount/autorelease

    * 不能使用NSAllocateObject/NSDeallocateObject

    * 须遵守内存管理的方法命名规则 (以init开始的方法的规则要比alloc/new/copy/mutableCopy更严格。该方法必须是实例方法,并且必须要返回对象。返回的对象应为id类型或者该方法声明类的对象类型,亦或是该类的超类型或子类型。)

    * 不要显式调用dalloc(无ARC是否有效,只要对象的所有者都不持有该对象,该对象就被废弃。对象被废弃时,不管ARC是否有效,都会调用对象的dealloc方法。)

    * 使用 @autoreleasepool 块代替 NSAutoreleasePool

    * 不能使用区域(NSZone)

    * 对象型变量不能作为C语言结构体(struct/union)的成员

    * 显式转换“id”和“void”

    相关文章

      网友评论

          本文标题:内存管理 - ARC规则

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