ARC - 具有CF实例变量的ObjC对象

时间:2014-03-14 18:04:09

标签: objective-c automatic-ref-counting core-foundation

我想我在这里是一个骨头......

静态分析器以-(void)doSomethingInteresting方法抱怨:

  

存储在myAddressBook中的对象可能泄漏

嗯,当然,这是有道理的;我正在调用create函数而没有匹配的release。但是,我认为我不想在myAddressBook结束时发布-doSomethingInteresting,因为我希望它能在AwesomeObject实例的生命周期中保留。

AwesomeObject.h

@interface AwesomeObject : NSObject

@property (assign, nonatomic) ABAddressBookRef addressBook;

@end

AwesomeObject.m

@implementation AwesomeObject

- (void)doSomethingInteresting
{
    CFErrorRef error = NULL;
    ABAddressBookRef myAddressBook = ABAddressBookCreateWithOptions(NULL, &error);

    [self setAddressBook:myAddressBook];
}

@end

编辑:附加屏幕截图

Static Analyzer Arrows

2 个答案:

答案 0 :(得分:3)

分析师并不了解您希望在您的媒体资源中分配保留的地址簿,因此不会在doSomethingInteresting结束时将其发布。

将您的财产更改为:

@property (strong, nonatomic) id addressBook;

并设置如下:

[self setAddressBook:CFBridgingRelease(addressBook)];

现在,当您想要使用addressBook属性时,请使用(__bridge ABAddressBookRef)强制转换。

此外,您需要发布可能在CFErrorRef期间创建的潜在ABAddressBookCreateWithOptions对象:

if(error)
{
    CFRelease(error);
    error = NULL;
}

答案 1 :(得分:0)

你需要这样称呼它:

 [self setAddressBook:CFBridgingRelease(myAddressBook)];