说在前面的话:本文中经常提到的“自己一词”,可以理解为“对象的使用环境”,但是理解为编程人员“自身“也是木有问题滴。
内存管理的四种方式
* 自己生成的对象,自己持有
*非自己生成的对象,自己也能持有
*不需要自己持有对象的时候释放
*释放非自己持有的对象
1.自己生成的对象,自己所持有
使用 alloc,new,copy,MutableCopy的方法或者以这几个单词开头的方法名称(驼峰命名法)生成的对象都只有自己持有。非驼峰命名法例如allocate,newer等等均不是,不属于同一类别的方法。
2.非自己生成的对象,自己也能持有
用alloc/new/copy/MutableCopy以外的方法取得的对象,不是自己生成并持有的,所以自己不是该对象的持有者。
id obj = [NSMutableArray array]; //取得的对象存在但自己不持有对象。
[obj retain];//自己持有非自己生成的对象
3.不再需要自己持有对象的时候释放
用alloc/copy/new/MutableCopy方法生成对象并持有的对象,或者用retain持有的对象,一旦不再需要,务必用release方法进行释放。
id obj = [[NSObject alloc] init];//自己生成并持有对象 ,引用计数为1
[obj retain];//自己持有对象,引用计数为2
[obj release];//释放对象,引用计数为1.指向对象的指针仍然能被保存在变量obj中,看起来能够访问,但是对象一经释放便不能访问!!!
id obj = [[NSMutableArray alloc] init];//自己生成但不持有持有对象 ,引用计数为0
[obj retain];//自己持有对象,引用计数为1
[obj release];//释放对象,引用计数为0.对象不可再被访问。
如果要用某个方法生成对象,并将其返还给该方法的调用方
(1)方法本身使取得的对象存在并且自己持有对象
- (id) allocObject{ //注意观察函数的命名规则哦
id obj = [[NSObject alloc] init];//自己生成并持有对象
return obj;//自己持有对象
}
......
//如果原封不动地调用这个方法,就能让调用方也持有这个对象
id obj1 == [obj0 allocObject];//取得非自己生成并持有的对象
(2) 方法本身使取得的对象存在,但不是自己持有。
- (id) object{ //注意这里的方法命名哦
id obj = [[NSObject alloc] init]; //自己生成对象并持有对象
[obj autorelease];//取得的对象存在但是自己不持有对象
return obj;
}
......
id obj = [obj0 object];//取得的对象存在但是自己不持有对象
[obj1 retain];//自己持有对象
补充:release与autorelease的区别
[obj release];会立即释放对象,不可再访问
[obj autorelease];不是立即释放,注册到autoreleasepoool中,经过一段时间,pool结束时自动调用release
4.无法释放非自己持有的对象
对于用alloc/new/copy/mutableCopy方法生成并持有的对象,或者是用retain持有的对象,由于持有者是自己,因此在不需要的时候可以释放。由此以外得到的对象不可以释放。在程序中释放了非自己持有的对象就会造成崩溃。
id obj = [[Nsobject alloc] int];//自己生成并持有对象
[obj release];//自己释放对象,不再持有对象
[obj release];//释放了不是自己持有的对象会造成崩溃
id obj1= [obj0 object];//生成对象存在,但是自己不持有
[obj1 release];//释放自己不持有的对象,crash
补充:会发生crash的情况
再度release已经废弃了的对象
访问已经废弃的对象







网友评论