首页 > 代码库 > Automatic Reference Counting

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都是强引用,所有都强持有新生成的对象。

 

Automatic Reference Counting