ARC
ARC是Automatic Reference Counting(自动引用计数)的缩写,是IOS5一同推出的新特性,但是IOS4.3也支持ARC,只是不能使用weak。
使用ARC,不需要再retain、release、autorelease,因为编译器会在合适的地方自动的插入retain、release。
ARC的黄金法则
1.只要还有一个变量(指针)指向对象,对象就会保持在内存中;
2.__strong告诉编译器此处添加retain,__strong可以省略。
NSString *string = @"Ray"
__strong NSString *string = @"Ray"
以上两种写法是等同的。
3.在ARC中。dealloc方法中不允许调用[super deslloc]
4.在ARC中,不允许使用retainCount属性、打印引用计数
5.在ARC中,不允许使用retain、release、autorelease,可以使用copy。
strong的使用
有两个指针指向了字符串对象@"Ray"
NSString *firstName = @"Ray";
self.textField.text = firstName;
当self.textField.text 指向字符串@"RayMan”,会先对@"Ray”对象release;
当firstName指向了@""字符串对象时,先会对原来指向的@"Ray”对象release。此时@"Ray”对象就没有一个指针指向它,引用计数也就是0,因此销毁。
weak的使用
weak修饰的变量不会将对象retain;
weak变量指向的对象如果销毁了,则weak所修饰的变量自动变为nil;
strong与weak
在引用strong修饰的对象时,该对象会被retain;
默认所有实例变量和本地变量都是strong类型的指针;(本地变量)
weak修饰的对象不会对此对象retain,相当于手动管理的assign。
在IOS4.3中ARC不能使用weak,替代者为:__unsafe_unretained,__unsafe_unretained与weak的功能一致,区别在于当指向的对象销毁后,不会将变量设置为nil;这样就有可能调用野指针。
weak可以防止循环引用,典型的就是delegate模式
代理对象delegate应该设置成weak;
property的修饰符总结
1.strong:等同于retain,属性成为对象的拥有者
2.weak:属性是weak pointer,当对象释放时会自动设置为nil,记住Outlet应该使用weak
3. __unsafe_unretained:等同于之前的assign,只有IOS4才能使用
4.copy:和之前的copy一样,复制一个对象并创建strong关联
5.assign:对象不能使用assign,但是原始(bool、int、float)仍然可以使用。
Block在ARC中的内存管理
在手动管理内存时,使用如下方式防止循环引用
__block SendViewContronller *this = self; _faceView = [[FaceScrollView alloc] initWithBlock:^(NSString *faceName){ this.textView.text = @"test"; }];
ARC中不能这样使用,以为变量this默认是strong引用,即使标记为__block也仍然为strong类型的引用,这时候__block的唯一功能是允许你修改已捕获的变量(没有__block则变量是只读)
__weak SendViewContronller *weakSelf = self; __faceView = [[FaceScrollView alloc] initWithBlock:^(NSString *faceName){ __strong SendViewContronller *strongSelf = weakSelf; if(strongSelf != nil){ strongSelf.textView.text = @"test"; } }];
在ARC环境中使用Block,推荐采用如下代码模板:
__weak id weakSelf = self; block = ^(){ __strong id strongSelf = weakSelf; if(strongSelf != nil){ //do stuff with strongSelf } };
ARC中使用Toll-Free Bridging
Toll-Free Bridging,简称TFB。是一种允许某些objc类与其对应的CoreFoundation类之间可以互换使用的机制。
比如:NSString与CFString是桥接的,这意味着可以将任意的NSString当作CFString使用,也可以将任意的CFString当作NSString使用。
ARC只能对OC对象进行内存管理,CFString桥接成NSString对象之后,此对象的内存管理该如何让管理?
在ARC中,CFString桥接成NSString使用__bridge_transFer, __bridge_transFer的作用将其他类型的对象转变成为一个OC对象,由ARC管理;与__bridge_transFer相同作用的还有CFBridgingRelease。
__bridge_retained的使用:NSString桥接成CFString用__bridge_retained,
对于某些我们不希望使用 ARC 的文件,例如第三方库源文件,可以在 Project Settings -> Build Phases 中,对这些文件选中 -fno-objc-arc 标志。这样 Xcode 编 译项目时,这些文件就不会使用 ARC, -fobjc-arc 标志是允许使用ARC