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时,废弃对象。

你可能感兴趣的:(iOS内存管理的猜想)