盲目依赖ARC带来的主要问题

来源:互联网 发布:桌面软件下载大全 编辑:程序博客网 时间:2024/06/05 11:09

(一)过度使用block之后,无法解决循环引用问题

  • 对象有一个Block属性,然而这个Block属性中又引用了对象的其他成员变量,那么就会对这个变量本身产生强引用,变量本身和他自己的Block属性就形成了循环引用。
__weak typeof(self) weakSelf = self;self.completionBlock = ^ {    if (weakSelf.success) {        weakSelf.success(weakSelf.responseData);    }};
  • 如果是在非ARC环境下:就将__weak替换为__block,__block变量的含义是在Block中引入一个新的结构体成员变量指向这个__block变量。__block typeof(self) weakSelf = self;表示Block不在对self对象retain。

(二)遇到底层Core Foundation 对象,需要自己手工管理它们的引用计数时,需要注意

Core Foundation框架 (CoreFoundation.framework) 是一组C语言接口,它们为iOS应用程序提供基本数据管理和服务功能。

底层的CoreFoundation对象,大多数以XxxCreateWithXxx的方式创建,例:

//创建一个CFStringRef对象CFStringRef str = CFStringCreateWithCString(kCFAllocatorDefault, "hello world", kCFStringEncodingUTF8);//创建一个CTFontRef对象CTFontRef fontRef = CTFontCreateWithName((CFStringRef)@"ArialMT", fontSize, NULL);

对于这些对象的引用计数的修改,要相应地使用CFRetain和CFRelease方法,如下:

//创建一个CTFontRef对象CTFontRef fontRef = CTFontCreateWithName((CFStringRef)@"ArialMT", fontSize, NULL);//引用计数加1CFRetain(fontRef);//引用计数减1CFRelease(fontRef);

对于CFRetain和CFRelease两种方法,可以认为它们与OC对象的retain和release方法等价。所以对于底层CoreFoundation对象,我们按照OC引用计数管理办法就行。

在ARC下,我们有时将一个Core Foundation对象转换成OC对象这个时候我们需要告诉编译器,转换过程中的引用计数需要如何调整。这就引入了与bridge相关的关键字,以下时这些关键字的说明:

  • __bridge:只做类型转换,不修改相关对象的引用计数,原来的Core Foundation对象在不用时,需要调用CFRelease方法。
  • __bridge_retained:类型转换后,将相关对象的引用计数加1,原来的Core Foundation对象在不用时,需要调用CFRelease方法。
  • __bridge_transfer:类型转换后,将该对象的引用计数交给ARC管理,Core Foundation对象在不用时,不再需要调用CFRelease方法。

更多细节参考这里

1 0
原创粉丝点击