版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shengpeng3344/article/details/64443418
1. 内存管理
办公室照明问题:
在办公室照明设备只有一个情况下,A进入办公室,开灯(生成对象),需要照明(持有对象),B进入办公室,需要照明(持有对象),当B离开办公室,即不需要照明时(释放对象),由于A还在需要照明,故灯还是打开状态,当A也离开办公室,办公室内没有人需要照明(释放对象),则灯关闭(废弃对象);
故所以,引用计数相当于这里的需要照明人的个数,需要照明则retain,不需要照明则release,当人数=0时,对象自然废弃(dealloc)
2.内存管理的思考方式
其中,内存管理有以下几种思考方式
- 自己生成的对象,自己所持有
- 非自己生成的对象,自己也能持有
- 自己持有的对象,不再需要时,释放
- 非自己持有的对象,无法释放
1.自己生成的对象,自己持有
使用以下名称开头的方法名,意味着自己生成对象且自己持有:
- alloc
- new
- copy
- mutableCopy
包含上面前缀的方法也一位置自己生成对象且自己持有:
- allocMyObject
- newMyObject
- copy###
- mutableCopy###
但对于以下名称,即使使用alloc,new,copy,mutableCopy开头,但不属于同一类别方法
- allocate
- newer
- copying
- mutableCopyed
/**
自己生成并持有对象
*/
id obj = [[NSObject alloc]init];
其中copy方法基于NSCopying协议,由各类实现copyWithZone:方法生成并持有对象。同样mutableCopy方法基于NSMutableCopying协议,由各类实现copyWithZone:方法生成并持有对象。用这些方法生成的对象虽然是副本,但同alloc,new一样,在自己生成自己持有这点上并没有区别。
2.非自己生成的对象,自己也能持有
使用非上面所叙述的 alloc/new/copy/mutableCopy方法所取得的对象,则是非自己生成,但自己持有
//取得非自己生成,但持有的对象
id obj = [NSArray array];
//自己持有 retain
[obj retain];
3.不再需要自己持有的对象时释放
主要是弄清release与autorelease的区别
//自己生成并持有
id obj = [[NSObject alloc]init];
//释放
[obj release];
//自己生成并持有
id obj = [[NSObject alloc]init];
//取得对象存在 但自己不持有对象
[obj autorelease];
4.无法释放非自己持有的对象
//自己生成并持有对象
id obj = [[NSObject alloc]init];
//obj 释放 自己不再持有
[obj release];
//崩溃 释放之后再次释放已非自己持有对象
[obj release];
更多底层alloc,copy等底层实现查看 《Objective-C高级编程 iOS与OS
X多线程和内存管理》,本文内容大多撰自此书