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的基础下。