# 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。当对象的引用计数器变为0的时候。对象就会被系统立即回收。并自动调用dealloc方法。为对象发送retain消息,对象的引用加数器就会+1为对象发送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的基础下。


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章