zoukankan      html  css  js  c++  java
  • Automatic Reference Counting

    NSObject简化版alloc:

    struct obj_layout {
        NSUInteger retained;
    };
    
    + (id)alloc {
        
        int size = sizeof(struct obj_layout) + 对象大小;
        struct obj_layout *p = (struct obj_layout *)calloc(1, size);
        return (id)(p + 1);
    }

    (将引用计数保存在对象占用内存块头部的变量中是GNUstep的实现。而苹果的实现,则是保存在引用计数表中。引用计数表可以用hash表实现,表键值为内存块地址的散列值。)

      retain方法使retained变量加1;

      release方法使retained变量减1;

      retainCount方法返回retained变量 + 1。

      autorelease方法的本质就是调用NSAutoreleasePool对象的addObject类方法。

    - (id)allocObject {
        
        id obj = [[NSObject alloc] init];
        return obj;
    }
    
    - (id)object {
        
        id obj = [[NSObject alloc] init];
        [obj autorelease];
        return obj;
    }
    
    id obj1 = [obj0 allocObject];
    id obj2 = [obj0 object];
    View Code

    obj1持有对象,obj2不持有对象。

    (可以认为object方法对应一个NSAutoreleasePool。方法结束时,NSAutoreleasePool被废弃,pool内obj的release方法被调用。)

    在ARC下,因为变量obj1和obj2都是强引用,所以都强持有新生成的对象。

    强引用存在循环引用问题,可以使用弱引用来避免。

    __weak修饰符注意点 

    弱引用失效时,会被置为nil。

    (__unsafe_unretained失效时,不会被置为nil。)

    id __weak obj = [[NSObject alloc] init];
    // 自己生成并持有的对象不能继续为自己所有,所以生成的对象会立即被释放。__unsafe_unretained修饰符也同样。
    

    __ autoreleasing用于对(id *)类型的参数传递.

  • 相关阅读:
    PHP的Tag标签
    PHP 常量
    MySQL知识点链接
    Codeforces Round #593 (Div. 2)D(螺旋形模拟)
    【PAT甲级】1060 Are They Equal (25 分)(需注意细节的模拟)
    【PAT甲级】1059 Prime Factors (25 分)
    【PAT甲级】1058 A+B in Hogwarts (20 分)
    【PAT甲级】1057 Stack (30 分)(分块)
    【PAT甲级】1056 Mice and Rice (25 分)
    Atcoder Grand Contest 039C(容斥原理,计数DP)
  • 原文地址:https://www.cnblogs.com/gattaca/p/5970954.html
Copyright © 2011-2022 走看看