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 *)类型的参数传递.

 

转载于:https://www.cnblogs.com/gattaca/p/5970954.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值