iOS内存管理的猜想
要初步理解ARC首先要有内存管理的思考方式:
1 自己生成的对象自己所持有
以alloc,copy,new,mutableCopy为名称开头的方法名意味着自己生成的对象只有自己持有。
2 非自己生成的对象自己也能持有
不以alloc,copy,new,mutableCopy为方法名的方法生成的对象是非自己生成并持有。
id obj = [NSArray array];//取得非自己生成并持有的对象,取得的对象存在但自己并不持有
[obj retain]; //自己持有对象
其中 非自己生成的对象,且该对象存在,但自己不持有这个特性是使用 autorelease 来实现的。
3 不再需要自己持有的对象时释放
4 非自己持有的对象不能释放
以上为内存管理的思考方式。
下面来探讨alloc/retain/release/dealloc的实现
//alloc 使用struct objc_layout来保存引用计数,并将其写入对象内存头部
struct objc_layout {
NSUInteger retained;
};
// alloc 开辟
+ (id)liZhiAlloc {
int size = sizeof(struct objc_layout) + 对象的大小;
struct objc_layout *p = (struct objc_layout *)calloc(1, size);
return (__bridge id)(p + 1);
}
//retainCount 获取引用计数
- (NSUInteger)liZhiRetainCount{
return ((__bridge struct objc_layout *)self)[-1].retained;
}
//retain 引用计数加1
- (id)liZhiRetain {
((__bridge struct objc_layout *)self)[-1].retained ++;
return self;
}
//releace 引用计数减1
- (void)liZhiReleace {
if (((__bridge struct objc_layout *)self)[-1].retained != 0) {
((__bridge struct objc_layout *)self)[-1].retained --;
} else {
[self lizhiDealloc];
}
}
//dealloc 废弃对象
- (void)liZhiDealloc
{
struct objc_layout *p = & ((__bridge struct objc_layout *)self)[-1];
free(p);
}
通过以上的探讨我们可以得出:
1 在oc的对象中存有引用计数;
2 调用alloc或者retain引用计数加一;
3 调用releace引用计数减一;
4 引用计数为0时,废弃对象。