1.内存管理/应用计数
1.2.1内存管理的思考方式
- 自己生成的对象,自己所持有。
- 非自己生成的对象,自己也能持有。
- 不再需要自己持有的对象时释放。
- 非自己持有的对象无法释放。
自己生成的对象,自己所持有
使用一下名称 开头 的方法名意味着自己生成的对象只有自己持有:
- alloc
- new
- copy
- mutableCopy
-
alloc
和new
id obj = [[NSObject alloc] init];
id obj = [NSObject new];
以上两者完全一致,指向生成并持有对象的指针被赋给变量obj
-
copy
和mutableCopy
copy
方法利用基于NSCopying方法约定,由各类实现的copyWithZone:方法生成并持有对象的副本。与copy
方法类似,mutableCopy
方法利用基于NSMutableCopying方法约定,由各类实现的mutableCopyWithZone:方法生成并持有对象的副本。
下列名称也意味着自己生成并持有对象:
- allocMyObject
- newThatObject
- copyThis
- mutableCopyYourObject
但是对于一下名称,即使使用alloc/new/copy/mutableCopy 名称开头,并不属于统一类别的方法:
- allocate
- newer
- copying
- mutableCopyed
非自己生成的对象,自己也能持有
用alloc/new/copy/mutableCopy 以外的方法取得的对象,因为非自己生成并持有,所以自己不是该对象的持有者。
id obj = [NSMutableArray array];
NSMutableArray类对象被赋给变量obj,但变量obj自己并不持有该对象。使用retain方法可以持有对象。
id obj = [NSMutableArray array];
[obj retain];
不再需要自己持有的对象时释放
非自己持有的对象无法释放