关于内存管理思考方式的一些学习总结
谈到内存管理首先想到的是“引用计数”这个名称,但真正正确客观的去思考这个问题,应该先理解以下几点:
- 自己生成的对象,自己所持有
- 非自己生成的对象,自己也能持有
- 不再需要自己持有的对象时释放
- 非自己持有的对象无法释放
下面我们看一下对象操作对应的表格
对象方法 | OC方法 |
---|---|
生成并持有的对象 | alloc/new/copy/mutableCopy等方法 |
持有的对象 | retain方法 |
释放对象 | release方法 |
废弃对象 | dealloc方法 |
接下来看一下具体的各个项目
自己生成的对象,自己持有
使用以下方法名开头意味着自己生成的对象自己持有:
- alloc
- new
- copy
mutableCopy
下面来举一个例子
/* *自己生成并持有对象 */ id obj=[[NSObject alloc]init];
非自己生成的对象,自己也可以持有
用上述方法以外的方法取得对象,因为非自己生成并持有,所以自己不是该对象的持有者。我们经常遇到的+(id)array方法便是
/*
*取得非自己生成并持有的对象
*/
id array=[NSMutableArray array];
/*
*取得的对象存在,但自己不持有对象
*/
[array retain];
/*
*自己持有对象
*/
不再需要自己持有的对象时释放
自己持有的对象,一旦不在需要,持有者有义务释放该对象,释放通过release方法。
/*
*取得非自己生成并持有的对象
*/
id array=[NSMutableArray array];
/*
*取得的对象存在,但自己不持有对象
*/
[array retain];
/*
*自己持有对象
*/
[array release];
/*
*释放对象
*对象不可再被访问
*/
无法释放非自己持有的对象
这个就好理解了,对于通过alloc/new/copy/mutableCopy方法生成的对象,或是retain持有的对象,在不需要时就需要将其释放。而由此以外所得的对象绝不能释放。倘若在应用程序中释放了非自己所持有的对象就会造成崩溃。
以上内存管理的思考方式是我在看书以及实践中所得,有不全面和不细致的地方,希望可以对看到的有所帮助。