一:四种方式
1.自己生成的对象,自己持有
2.非自己生成的对象,自己也能持有
3.不再需要自己持有的对象时释放
4.无法释放非自己持有的对象
二:四种方式详解
1.自己生成的对象,自己持有:
通过alloc,new,copy,mutableCopy方法生成的对象为自己生成并持有
id obj = [[NSObject alloc] init];
2.非自己生成的对象,自己也能持有
用alloc,new,copy,mutableCopy以外的方法取得的对象,自己不持有该对象.调用retain方法后才持有该对象
// 取得对象存在,但自己不持有该对象
id object = [NSMutableArray array];
// 自己持有对象
[obj retain];
3.不再需要自己持有的对象时释放
3.1 情况一: // 自己生成并持有对象
id obj = [[NSObject alloc] init];
// 释放对象(指向对象的指针仍然被保留在变量obj中,貌似能够访问,但对象一经释放绝对不可访问)
[obj release];
3.1 情况二: // 非自己生成并持有对象
// 取得对象存在,但自己不持有该对象
id object = [NSMutableArray array];
// 自己持有对象
[obj retain];
// 释放对象
[obj release];
注意: 1. release是立即释放; 2. autorelease不立即释放,注册到autoreleasepool中,等到 pool结束时再调用release释放对象.
4.无法释放非自己持有的对象
4.1 取得对象存在,并持有对象时释放
id obj = [[NSObject alloc] init];
// 释放对象
[obj release];
// 释放对象之后再次释放(此时由于对象已经被释放,所以现在不持有该对象,这时再次释放会导致崩溃)
[obj release];
4.1 取得对象存在,但不持有对象时释放
// 取得对象存在,但自己不持有该对象
id object = [NSMutableArray array];
[obj release]; // 由于此时释放了自己不持有的对象,会造成崩溃
网友评论