【问题标题】:ARC - ObjC Objects with CF instance variablesARC - 带有 CF 实例变量的 ObjC 对象
【发布时间】:2014-04-20 04:36:16
【问题描述】:

我觉得我在这里是一个骨头头......

静态分析器在-(void)doSomethingInteresting方法中报错:

存储到 myAddressBook 中的对象的潜在泄漏

嗯,当然,这是有道理的;我正在调用 create 函数而没有匹配的 release。但是,我不认为我想在-doSomethingInteresting 的末尾释放myAddressBook,因为我希望它在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

编辑:附上屏幕截图

【问题讨论】:

  • 属性应该保留,然后你应该释放......这样对象就是所有者而不是本地范围。

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


【解决方案1】:

分析器不了解您希望在您的财产中分配保留的通讯录,因此不会在doSomethingInteresting 末尾释放它。

将您的属性更改为:

@property (strong, nonatomic) id addressBook;

然后这样设置:

[self setAddressBook:CFBridgingRelease(addressBook)];

现在,当您想使用 addressBook 属性时,请使用 (__bridge ABAddressBookRef) 演员表。

另外,您需要释放一个潜在的CFErrorRef 对象,该对象可能已在ABAddressBookCreateWithOptions 期间创建:

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

【讨论】:

    【解决方案2】:

    你需要这样称呼它:

     [self setAddressBook:CFBridgingRelease(myAddressBook)];
    

    【讨论】:

    • 不应该。 :) 像往常一样应该是strong(应该是id),我们只是把它交给ARC来管理,直到时间结束。
    • @matt 是的,我知道它应该是什么,但你应该在你的答案中指出它,而不是指向你的书。
    • @LeoNatan 这不是广告!它是免费的教程材料,就像任何其他材料一样。我特意把这些东西放到网上,以便公开和免费使用。这还不错,很好。
    • @LeoNatan 这就是我认为我所做的。嘿,市场决定了 - 你得到了几个赞成票和复选标记,为什么会成为一个糟糕的赢家?这就是 Stack Overflow 很棒的原因!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-07
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    • 2015-11-03
    相关资源
    最近更新 更多