recce3.jpg
首先明确一下,Objective-C的内存管理,即引用计数。
内存管理方式目前是两种,ARC(Automatic Refrence Counting)自动引用计数和MRC(Mannul Refrence Counting)手动引用计数。相信现在的项目都用上了ARC,显而易见,ARC相对MRC,无需再次敲 retain 或 realse了,不仅降低了程序崩溃,内存泄漏的风险,还能少敲代码。不过在了解ARC前先了解下Objective -C的引用计数式内存管理的思考方式(MRC)吧。有人会说现在都什么时代了,都用ARC了,还搞这个干啥?too young to simple,其实引用计数式内存管理的本质部分在ARC中并没有改变。
其思考方式分为四点:
1.自己生成的对象,自己持有;
2.不是自己生成的对象,自己也能持有(通过retain);
3.不再需要自己持有的对象时释放掉(通过release);
4.不是自己持有的对象是不能释放的。
下面分别细说这四点。
先将环境设置成MRC,如下图所示:
设置成MRC.jpeg
一、自己生成的对象,自己持有
1.哪些是自己生成的对象?
答:那些使用alloc/new/copy/mutableCopy方法名的意味着自己生成的对象只有自己持有。,比如:
UILabel *label = [[UILabel alloc]init];
UILabel *label = [UILabel new];
......
2."自己"指的是啥?
答:指的是对象的使用环境
3.简单的扩展
提到copy,就不禁想到深拷贝(Deep copy)与浅拷贝(Shallow copy),下面用三句话概括。
浅拷贝只是拷贝指针
深拷贝拷贝出一个新的对象
而深拷贝还有个概念就是 单层深拷贝(不是真正的深拷贝),下面举例说一下
比如 一个对象A 他有一个属性B 这个属性B也是个对象 B也有一个自己的属性C 那么单层深拷贝就是指创建了一个新对象M 这个M拷贝了A的属性B 但没有拷贝B自己的属性C,而完全深拷贝(真正的深拷贝)是会逐级得连C也一起拷贝。
二、不是自己生成的对象,自己也能持有
哪些是自己生成的对象?
答:那些使用一种方法名以外取得的对象。,比如:
id obj = [NSMutableArray array];
......
此时的obj只是存在,但自己并不持有,通过retain来持有
[obj retain];
三、不再需要自己持有的对象时释放掉
UILabel *label = [[UILabel alloc]init];
[label release];//释放后的对象不可以再被访问
*******************************************
id obj = [NSMutableArray array];
[obj retain];//持有
[obj release];//释放
四、不是自己持有的对象是不能释放的
如果不是自己持有的对象,释放后就会导致程序崩溃,show u code.
敲入如下代码:
将自己持有对象关闭.png
程序崩溃.png
关于Objective-C内存管理思考方式先简单的记录到此,至于ARC,日后有空的话会记录。













网友评论