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
网友评论