ios arc注意

CoreFoundation对象与NSObject对象的转换,需要添加bridge, _bridgeretained或者bridge_trasfer。

CoreFoundation的对象例如CFStringRef有自己的引用计数,和Cocoa框架中的NSObject是不同的方法,ARC只对NSObject对象的引用计数有效。只要是生成CF对象的函数名中有含有Create, Copy, 或者Retain,就表示需要为它的引用计数负责,需要使用结束时CFRelease()将引用计数减一。

例如:如果使用了一个含有reate, Copy, 或者Retain的方法生成了一个CFStringRef name,那么在转换成NSString时,就需要写成NSString *nameString = (__bridge_transfer NSString *)name;

  • _bridgetransfer的含义表示将CF对象的管理权移至NSObject层由ARC负责,无需再用CFRelease()释放name这个CFStringRef。
  • _bridgeretained的含义相反,就是将一个NSObject对象转换成CF对象,并且引用计数加一,那么在CF层用完这个CF对象后,就需要使用CFRelease()释放该对象,因为内存管理权已经由NSobject层转移至CF层。
  • __bridge的含义表示在NSObject层和CF层引用计数都平衡,无需转移内存管理权。 例如如果使用不包含reate, Copy, 或者Retain的函数获得的CFStringRef name转换成NSString时,无需处理引用计数问题,因此可以这样转换:NSString *nameString = (__bridge NSString *)name;

除了上面三个关键字,还有两个宏CFBridgingRetain()和CFBridgingRelease()来控制CF层与NSObject层的引用计数平衡,不过实际上他们就是bridgeretained和bridgetransfer。

CFTypeRef CFBridgingRetain(id X)  
{ return (__bridge_retained CFTypeRef)X; }

id CFBridgingRelease(CFTypeRef CF_CONSUMED X)  
{ return (__bridge_transfer id)X; }

3) NSInvocation方法 
例如:

NSString *date = @”test”;  
[writeInvocation setArgument:&data atIndex:2];

NSInvocation在设置调用参数时会提示:NSInvocation's setArgument is not safe to be used with an object with ownership other than __unsafe_unretained 
修改方法需要将传入的参数添加_unsafeunretained关键字,即NSString * __unsafe_unretained date = @”test”;

4) NSAutoreleasePool 
ARC下不再支持NSAutoreleasePool,需要使用@autoreleasepool{}替换。

5) 错误Passing address of non-local object to __autoreleasing parameter for write-back。 
此错误通常是由于将非局部变量的地址传递给一个方法导致的,例如: 下面接口的声明为-(void)initArgument:(NSArray **)array

//_array是一个NSArray的成员变量,在这个方法中初始化,由于这个参数是__autoreleasing的,所以会报上面的错误
[testObject initArgument:_array];

处理方法也比较简单,将方法的参数声明为__strong即可:-(void)initArgument:(NSArray * __strong *)array

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值