OC 30 day
为什麽放这张图?应为我觉得MRC就像是古老的仪式。既然MRC已经没什麽人在用了,为什麽还要学?因为ARC的机制是源自於MRC,因此要用ARC必须要再会使用MRC的基础下。
iOS5开始,Xcode4.2开始支持ARC。 Xcode7 默认支持ARC开发。默认使用的开发方式就是ARC模式。
ARC的运作机制,当对象的引用计数器变为0的时候,系统会自动回收对象,在系统回收对象的时候,会自动调用对象的dealloc方法。
到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。
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消息。
什麽时候为对象发送release消息。
当少一个人使用这个对象时,应该为这个对象发送release消息。
只要dealloc这个方法执行,就会释放这个对象。
所以在ARC机制下,retain release dealock这些方法无法调用。
内存管理的原则。
有对象的创建,就要匹配一个release。
谁retain谁就release。
在写专案时,估计还是会用ARC。但是我认为因为ARC的机制是源自於MRC,因此要用ARC必须要再会使用MRC的基础下。
>>: [JS] You Don't Know JavaScript [Async & Performance] - callbacks
模型分析 TFMA 介绍 过往我们关注模型的训练结果,会追踪该模型在每次 epochs 之後的 AU...
Hashicorp Vault: Audit log 启用audit log的设定不在设定档内,而是...
为什麽要做测试? 今天在外面餐厅吃饭,厨师在出菜前会先试吃看看味道对不对;一台咖啡机,在出厂前也会经...
如果被老板发现我们可以一眼监定出需求的细节和问题的原因,那我们的工作量会不会变更多 我们要Mock的...
Random乱数方法,顾名思义产生乱数,在程序中,若想要产生乱数的话,我们会使用此方法。 Rando...