【问题标题】:How to properly handle CF objects created at the beginning of the program and deleted at the end如何正确处理程序开头创建、结尾删除的CF对象
【发布时间】:2013-04-07 10:12:24
【问题描述】:

我放了

我声明 @property (nonatomic) ABAddressBookRef addressBook; 作为类扩展的属性

-(void)dealloc
{
    [[NSNotificationCenter defaultCenter]removeObserver:self];

    CFRelease(self.addressBook);
}

然后在仅由 viewDidLoad 调用的函数中,我添加: -(void) vCreateAddressBookAndPopulateContact

{
    self.addressBook = ABAddressBookCreate(); //will be released at dealloc
    [self vPopulateContact];
}

它给了我警告: 分配时:

Object leaked: allocated object is not referenced later in this execution path and has a retain count of +1

在释放时:

Incorrect decrement of the reference count of an object that is not owned at this point by the caller

那么,我该怎么办?如何告诉编译器该对象稍后将在 dealloc 时被取消引用?

我希望我可以将那个 ABAddressBookRef 移到 ARC/NS 土地上。但是没有办法这样做。

self.addressBook 无法在函数处释放。那是因为如果我想添加或删除

【问题讨论】:

  • 您的addressBook 属性是如何声明的?
  • @property (nonatomic) ABAddressBookRef addressBook;

标签: objective-c xcode4.5


【解决方案1】:

(这更像是一种解决方法,也许其他人有更好的答案。)

如果您将addressBook 定义为不是属性而是作为实例变量(可能在类扩展中),则不会出现问题:

@interface YourClass () {
    ABAddressBookRef addressBook;
}

属性的问题在于

self.addressBook = ABAddressBookCreate();
// ...
CFRelease(self.addressBook);

被翻译成

[self setAddressBook:ABAddressBookCreate()];
// ...
CFRelease([self addressBook]);

因此静态分析器此时不会“看到”地址簿引用被保留 在某些实例变量中。

备注:dealloc,你应该检查addressBook不是NULL

if (addressBook != NULL)
    CFRelease(addressBook);

避免在viewDidLoad中未初始化变量的情况下崩溃。

更新:(受@11684 评论的启发!)您也可以保留您的财产,并使用 仅用于创建和发布的关联实例变量:

_addressBook = ABAddressBookCreate();
// ...
if (_addressBook != nil)
    CFRelease(_addressBook);

在这种情况下,将属性定义为“只读”是有意义的。

【讨论】:

  • 您可以拥有同名的属性和实例变量。也许这行得通?
  • @11684:使用属性的关联实例变量实际上是一个好主意(并且它不必具有相同的名称)。我已经相应地更新了答案,我希望你没问题。
  • 为什么对我来说不行?
  • @11684:当我在回答中使用别人的想法时,我更喜欢问!
  • 嗯,你的要求是我认为它本身没问题的一个原因。另外,StackOverflow 用于收集知识,而不是声誉点。 @MartinR
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-20
  • 1970-01-01
  • 1970-01-01
  • 2015-05-22
相关资源
最近更新 更多