1.内存管理的思考方式:
- .自己生成的对象,自己所持有
- .非自己生成的对象,自己也能持有
- 不再需要自己持有的对象时释放
- 非自己持有的对象无法释放
由NSObject类担任下面管理职责
eg:
/*
* 取得的对象存在,但是自己不持有
*/
id obj = [NSMutableArray array];
/*
* 自己持有对象
*/
[obj retain];
2.autrelease
autorelease对待实例相当于c语言里面的局部变量,出了区域就被废弃(如果对自动释放池进行自动释放,那么会出现异常—>理由:无论调用哪一个对象的autorelease实例方法,实际上是调用NSObject类的autorelease实例方法,但是对于NSAutorelease类,autorelease实例方法已被该类重载,因此运行时会出错)
使用方法:
- 生成并持有NSAutoreleasePool对象
- 调用已经分配对象的autorelease
- 废弃NSAutoreleasePool对象
autrelease生命周期
- 自己设定的释放池的生命周期:,超出其作用域就会自动废弃(某一段程序大量生成autorelease对象使用)
- 系统的释放池:程序主循环的NSRunLoop或者其他程序可以运行的地方,对释放池对象进行生成,持有和废弃,(程序关闭)
3.ARC下的四种修饰符
1.__strong、__weak、__unsafe_unretained、__autoreleasing
__strong修饰符是id类型和对象类型默认的所有权修饰符,
__strong、__weak、__autoreleasing修饰符所修饰的自动变量初始化为nil,即:
id __strong obj0;
id __weak obj1;
id __autoreleasing obj2;
// 等同于下面代码
id __strong obj0 = nil;
id __weak obj1 = nil;
id __autoreleasing obj2 = nil;
// 1.__block不管是ARC还是MRC模式下都可以使用,可以修饰对象,还可以修饰基本数据类型。
2.__weak只能在ARC模式下使用,也只能修饰对象(NSString),不能修饰基本数据类型(int)。
3.__block对象可以在block中被重新赋值,__weak不可以。
3.__block对象可以在block中被重新赋值,__weak不可以。
PS:__unsafe_unretained修饰符可以被视为iOS SDK 4.3以前版本的__weak的替代品,不过不会被自动置空为nil。所以尽可能不要使用这个修饰符。