[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的主要内容,如果未能解决你的问题,请参考以下文章