自动引用计数器(一)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiaoxingaiwo/article/details/81037831

自动引用计数器是指内存管理中引用采取自动计数的计数。
一.内存管理的思考方式
思考方式分为四类:

1.自己生成的对象,自己所持有。
2.非自己生成的对象,自己也能持有。
3.不在需要自己持有的对象时候释放。
4.非自己持有的对象无法释放。

生成并持有对象——–>alloc/new/copy/mutableCopy
持有对象————->retain方法
释放对象————->release方法
废弃对象————->dealloc方法
·自己生成的对象,自己所持有
使用以下名称开始的方法名意味着自己生成的对象只有自己持有:alloc,new,copy,mutableCopy

自己生成并持有的对象Object-C距离
id obj=[[NSObject alloc]init];
id obj=[NSObject new];

另外使用以下名称开头的方法名也意味着自己生成并持有对象。
allocMyObject,newThatObject,copyThis,mutablecopyYourObject。
但是对于以下名称开头的并不为自己生成并持有。
allocate,newer,copying,mutableCopyed。
·非自己生成的对象,自己也能够持有

id obj=[NSMutableArray array];//获得的对象存在,但自己并不持有
/获得的对象并自己持有/
id obj=[NSMutableArray array];
[obj retain];

·不在需要自己持有的对象时候释放

id obj=[[NSObject alloc]init];
[obj release];

自己生成而非自己所持有的对象,若用retain方法变为自己为持有者,也可以使用release方法释放。

id obj=[NSMutableArray array];
[obj retain];
[obj release];//释放对象,对象不可再被访问

那么使用某个方法生成对象,并将对象返还给调用方的源码如下:
这里写图片描述
自己生成并不持有的源码如下:
这里写图片描述
autorelease与release区别如下:
release是立马释放,autorelease是不立即释放,是注册到autoreleasepool中,等经过一段时间poo结束时候才会自动调用release方法。
·无法释放非自己持有的对象
这里写图片描述
这里写图片描述
二.alloc/retain/release/dealloc的实现
虽然说苹果没有公开包含NSObject类的Foundation框架源代码,不过,Foundation框架使用的Core Foundation框架的源代码,以及通过NSObject类进行内存管理部分的源代码是公开的。我们可以使用开源软件GNUstep实现,源码可到官网下载,并用xcode打开查看。
下面是NSObject类的alloc类方法在NSObject.m文件:
这里写图片描述
这里写图片描述
通过以上图片可以看到通过allocWithZone方法调用了NSAllocateObject函数进行了分配对象。
这里写图片描述
通过上面的图片可以看到使用通过调用NSZoneMalloc函数类分配存放对象所需要的内存空间,之后将该内存空间置为0,最后返回作为对象而使用的指针。
NSDefaultMallocZone。NSZoneMalloc等名称中包含的NSZone是什么?他是为防止内存碎片化而引入的结构。对内存对象进行多重化管理,根据使用对象的目的,对象大小分配内存,从而提高了内存管理的效率。根据官方arc文档说的,现在运行时系统只是简单的忽略了区域的概念。运行时系统中内存管理本身已经极具效率,使用区域来管理内存反而会引起使用效率低下以及源代码复杂等问题。
下面是去掉NSZone的源代码:
这里写图片描述
在object-c中可通过[对象指针 retainCount]来获取本类的引用计数器。下面是retainCount的源码:
这里写图片描述
这里写图片描述
图片上面的注释写的是如果使用alloc/new/copy/mutableCopy等方法分配内存,则他的引用计数器永远大于0。
总结下:1.在OC的对象中存有引用计数器这一整数值。2.调用allooc或者retain方法后,引用计数器加1。3.调用release后,引用计数器减1。4.引用计数器值为0时,调用dealloc方法废弃对象。

猜你喜欢

转载自blog.csdn.net/xiaoxingaiwo/article/details/81037831