2

我放

我声明 @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 无法在函数中释放。那是因为如果我想添加或删除

4

1 回答 1

3

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

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

@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);

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

于 2013-04-07T10:50:24.513 回答