OC引用计数

2017-03-25  本文已影响12人  尽斩桃花三千

1.使用 alloc, new,copy,mutableCopy 生成的对象,自己生成并持有. 需要自己手动rretain和release

2.如array,mutableArray这样生成的对象,非自己生成并持有.源码如:

-(NSArray *)array{

NSArray *array = [NSArray alloc]init];

[array autoRelease];

return array;

}

对象调用autoRelease后,会注册到autoReleasepool中,当pool结束时,会自动调用release释放对象.

3.引用计数保存在对象的头部,可以使用retainCount取得, 当retainCount为0时,会调用dealloc废弃对象.

4.autoRelease的对象,并不会立即释放,而是在pool被废弃的时候释放.   autoReleasepool就像一个括号,对象就像一个局部变量,当超出作用域,对象就会被释放掉.  整个app的主程序就是在autoReleasepool中运行的.

5.如果嵌套生成autoReleasepool对象,理所当然的会使用内侧的对象.

所有权修饰符

1. __strong 指向并持有对象. 

2.__weak 指向但不持有对象

3.__unsaft__unretain 修饰的变量,不属于编译器的内存管理对象.  __unsaft__unretain修饰的对象,和__weak修饰的对象类似,并不会持有对象.    使用__unsafe_unretain

4.ARC有效是,不能直接使用 autorelease   和NSAtutoReleasePool对象, 应该用 @autoreleasepool{........};  在@autoreleasepool{}的范围内,使用__autorelease 修饰对象,等价于在MRC情况下,调用 autorelease 方法

属性声明                                        所有权修饰符

assign,unsaft_unraetained              __unsafe__unretain

copy ,retain ,string                           __strong

weak                                                     __weak

上一篇下一篇

猜你喜欢

热点阅读