现在的位置: 首页 > 综合 > 正文

ARC(自动引用计数)

2019年05月16日 ⁄ 综合 ⁄ 共 2369字 ⁄ 字号 评论关闭

ARC

ARCAutomatic 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

【上篇】
【下篇】

抱歉!评论已关闭.