码迷,mamicode.com
首页 > 其他好文 > 详细

[OC]MRC和ARC

时间:2016-05-20 10:04:14      阅读:276      评论:0      收藏:0      [点我收藏+]

标签:

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

标签:

原文地址:http://www.cnblogs.com/ybw123321/p/5510996.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!