安全地使用CFBridgingRelease

时间:2014-10-25 02:28:55

标签: ios objective-c automatic-ref-counting

我对objective-c比较新,我一直在抓住它的运行时是如何工作的。在这种情况下,我不确定这段代码是否安全:

CFErrorRef errorRef;
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &errorRef);
NSError * error = (NSError *)CFBridgingRelease(errorRef);

if (error != nil) {

}

具体来说,如果errorRef没有引用任何内容(我猜是NULL,而不是nil,对吧?),这个演员会不会安全?

1 个答案:

答案 0 :(得分:1)

不,这段代码不安全。根据Apple的文档:

  

错误:出错时,包含错误信息。

这意味着它无法保证成功的价值。你也没有初始化变量 - 不是我信任ABAddressBookCreateWithOptions而是让它成功。 API文档并不能保证这一点。 (我怀疑它会起作用,但这不是你应该依赖的那种东西。)

您需要检查功能是否成功。只有在失败时才会尝试访问错误。

安全代码是这样的:

CFErrorRef errorRef;
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &errorRef);
if (!addressBook) {
    NSError *error = (NSError *)CFBridgingRelease(errorRef);
}