# iOS APP 开发 OC 第十八天,MRC 实作

tags: OC 30 day


为什麽放这张图?应为我觉得MRC就像是古老的仪式。既然MRC已经没什麽人在用了,为什麽还要学?因为ARC的机制是源自於MRC,因此要用ARC必须要再会使用MRC的基础下。

划炼成阵前,先了解炼成阵的由来

MRC的历史

iOS5开始,Xcode4.2开始支持ARC。 Xcode7 默认支持ARC开发。默认使用的开发方式就是ARC模式。
ARC的运作机制,当对象的引用计数器变为0的时候,系统会自动回收对象,在系统回收对象的时候,会自动调用对象的dealloc方法。

关闭ARC开启MRC


到project里的build settings 里搜寻 Automatic。可以找到OC 的ARC全名,将它关闭就可以了。

但是我有些地方想用ARC,有些地方想用MRC怎麽办?
全局的设定可以从build Setting 设定,而特定的档案再从Build Phases设定。

感谢 swift线上读书会的工程屍解答

手工练成回收机制

ARC的运作机制,当对象的引用计数器变为0的时候,系统会自动回收对象,在系统回收对象的时候,会自动调用对象的dealloc方法。
我们来了解dealloc如何运作的。

重写dealloc方法的规范:
必须要调用父类dealloc方法,并且要放在最後一句的地方。

#import "Person.h"
@interface Person()
//@property (nonatomic,copy) NSString *message;
@end
@implementation Person
// 只要这个方法被执行,就代表这个对象被回收了
- (void)dealloc
{
    NSLog(@"%@",_name);
    [super dealloc];
}
- (void)sayHi{
    NSLog(@"Hi");
}

@end

我们先来实验看看,当我们实例化Person这个对象时,引用计数器是否有加1。

  1. 新创建一个对象,这个对象的引用计数器的值默认是1。
  2. 当对象的引用计数器变为0的时候。对象就会被系统立即回收。并自动调用dealloc方法。
  3. 为对象发送retain消息,对象的引用加数器就会+1
  4. 为对象发送release消息,并不是回收对象,而是让对象引用计数器-1,当对象的引用计数器的值为0的时候。对象才会被系统立即回收。
int main(int argc, char * argv[]) {
    @autoreleasepool {
        Person *p1 = [[Person alloc]init];
        NSUInteger count = [p1 retainCount];
        NSLog(@"count = %lu",count);
    }
}

结果打印出来,确实引用数有加1。

我在Person里面加入了dealloc的方法,我们来试试看回收的效果吧。
引用计数器-1 [p1 release];

int main(int argc, char * argv[]) {
    @autoreleasepool {
        Person *p1 = [[Person alloc]init];
        p1.name = @"猴子";
        NSUInteger count = [p1 retainCount];
        NSLog(@"count = %lu",count);
        [p1 release];
    }
}

我们可以看到引数为零的时候,对象就被清空了。

我们再来尝试手动引用计数器+1。[p1 retain];

int main(int argc, char * argv[]) {
    @autoreleasepool {
        Person *p1 = [[Person alloc]init];
        p1.name = @"猴子";
        NSUInteger count = [p1 retainCount];
        [p1 retain];
        NSLog(@"count = %lu",count);
        [p1 release];
    }
}

奇怪猴子怎麽没有去了?为什麽对象没有回收?

为对象发送release消息,并不是回收对象,而是让对象引用计数器-1,当对象的引用计数器的值为0的时候。对象才会被系统立即回收。

总结:内存管理的重点

什麽时候为对象发送retain消息。

当多一个人使用这个对象时,应该为这个对象发送retain消息。
什麽时候为对象发送release消息。
当少一个人使用这个对象时,应该为这个对象发送release消息。
只要dealloc这个方法执行,就会释放这个对象。
所以在ARC机制下,retain release dealock这些方法无法调用。
内存管理的原则。

retain 的次数跟 release的次数一定要匹配。

有对象的创建,就要匹配一个release。
谁retain谁就release。

谁用谁retain,谁不用谁 release。

只有在多一个人用时才retain 少一个人使用时才release。

有始有终,有加就有减。

总结

在写专案时,估计还是会用ARC。但是我认为因为ARC的机制是源自於MRC,因此要用ARC必须要再会使用MRC的基础下。


<<:  我最喜欢的五个认证

>>:  [JS] You Don't Know JavaScript [Async & Performance] - callbacks

Day 23 : 模型分析 TensorFlow Model Analysis (TFMA)

模型分析 TFMA 介绍 过往我们关注模型的训练结果,会追踪该模型在每次 epochs 之後的 AU...

Day 18. Hashicorp Vault: Audit log (1)

Hashicorp Vault: Audit log 启用audit log的设定不在设定档内,而是...

Day 28:元件的单元测试

为什麽要做测试? 今天在外面餐厅吃饭,厨师在出菜前会先试吃看看味道对不对;一台咖啡机,在出厂前也会经...

[Day 2]我也好想要有监定技能(後端篇)

如果被老板发现我们可以一眼监定出需求的细节和问题的原因,那我们的工作量会不会变更多 我们要Mock的...

Day9 random 乱数方法

Random乱数方法,顾名思义产生乱数,在程序中,若想要产生乱数的话,我们会使用此方法。 Rando...