美文网首页iOS Developer
iOS进阶系列之Objective-C内存管理思考方式

iOS进阶系列之Objective-C内存管理思考方式

作者: APP叫我取个帅气的昵称 | 来源:发表于2017-03-01 16:40 被阅读118次
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,日后有空的话会记录。

相关文章

网友评论

    本文标题:iOS进阶系列之Objective-C内存管理思考方式

    本文链接:https://www.haomeiwen.com/subject/ntgqgttx.html