[OC]MRC和ARC

Posted ybw123321

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[OC]MRC和ARC相关的知识,希望对你有一定的参考价值。

OC中,创建了一个对象,就会在内存中开辟一个空间,obj的指针就指向这块空间⬇️

referenceCount:引用计数器:存储当前有多少指针引用这块空间。

此时referenceCount为1。

如果再创建其他对象也指向obj⬇️obj就会调用retain方法:

referenceCount就会自动+1,此时referenceCount为4(第一个obj创建NSObject alloc的时候就+1了)。

当不要一个对象的时候,如果调用release方法,referenceCount就会-1,如果obj1调用一次,obj2调用一次,obj3调用一次,referenceCount就会变为1,如果最后obj也调用一次,referenceCount就会变为0,此时系统将真正回收这块空间。

现在创建的工程自动使用ARC,如何改为MRC呢?

创建一个Dog类,测试retain方法

Dog *dog = [[Dog alloc]init];//开辟一个内存空间,指针dog指向该空间
NSLog(@"%zd",dog.retainCount);
Dog *dog1 = dog;
NSLog(@"%zd",dog.retainCount);

 这样打印出来的retainCount都是1,也就是说并没有多一个指针指向该空间。要如何解决呢?

Dog *dog1 = [dog retain];

 如果是这样把dog的指针给dog1,此时retainCount就会变成2。

如果要干掉dog1,需要这样操作⬇️

[dog1 release];//告诉dog少了一个指针指向它
dog1 = nil;//置为空,避免乱指

 内存管理的黄金法则:

对一个OC对象进行alloc、retain、copy、mutableCopy的时候需要对该对象进行release或autoRelease操作。

当引用计数器为0,object会调用一个析构方法,系统会回收内存空间,现在我们在Dog类中重写析构方法看看到底什么时候调用了dealloc方法⬇️

在.m文件中

-(void)dealloc
{
    NSLog(@"Dog is dead");
    [super dealloc];//回收内存
}

 接下来把狗一只只杀死

[dog2 release];
dog2 = nil;
[dog release];
dog = nil;

 此时打印结果是这样的:

我们可以看到,最后一只狗dog被release的时候,系统调用了dealloc,此时引用计数器为0。

 

以上是关于[OC]MRC和ARC的主要内容,如果未能解决你的问题,请参考以下文章

OC_内存管理:MRC与ARC

oc56--ARC多个对象的内存管理

OC系列高级-内存管理

OC 属性修饰符篇

ARC内存管理机制详解

MRC和ARC混编