3

我正在尝试使用地址簿,但我对内存管理的理解充其量只是马马虎虎。

我的项目正在使用自动引用计数 (ARC),但据我所知,ARC 仅在 Objective-C 领域管理保留/释放。

我知道我的第一个函数调用:ABAddressBookCreate()返回一个我“拥有”的 ABAddressBookRef,因为我是从Create名称中的方法中获取它的。当我CFRelease完成它时,我会它。

我不明白的是 ABRecordRef 在此方法的过程中如何保持活动状态。我不应该这样CFRetainCFRelease吗?如果我不保留/释放ABAddressBookRef.

    ABAddressBookRef iPhoneAddressBook = ABAddressBookCreate();    
    ABRecordRef record = ABAddressBookGetPersonWithRecordID(iPhoneAddressBook, self.addressBookRecordID);

    NSString *firstName = (__bridge_transfer NSString*)ABRecordCopyValue(record, kABPersonFirstNameProperty);
    NSString *lastName = (__bridge_transfer NSString*)ABRecordCopyValue(record, kABPersonLastNameProperty);
    NSString *fullName = [NSString stringWithFormat:@"%@ %@", firstName, lastName];

    ABMultiValueRef phoneRef = ABRecordCopyValue(record, kABPersonPhoneProperty);

    // Set up an NSArray and copy the values in.
    NSArray *phoneNumberArray = (__bridge_transfer id)ABMultiValueCopyArrayOfAllValues(phoneRef);


    CFRelease(iPhoneAddressBook);

    // Finally, do stuff with contact information in Obj-C land..

退出问题:我是否通过在最后一行不CFRelease使用 my调用而造成泄漏?ABMultiValueRef phoneRef

4

1 回答 1

5

在处理 Core Foundation 内存管理时,您需要参考这些所有权策略

您问题的关键在于“获取规则”,它指出您从中获得的任何 CF* 对象和包含“获取”一词的核心基础函数,您不拥有它,也不能保证它的使用寿命。重要的区别是“不能保证有效性”和“无效”。您可能会引用一个您不拥有但其生命周期由其他来源支持的对象。在这种情况下,您仍然可以使用它而不会崩溃。

从技术上讲,这就是您的ABRecordRef. 您没有拥有它,但ABAddressBookRef您从中获取记录的极有可能拥有它,因此保持它的活力。只要那ABAddressBookRef是有效的,它的记录也将是有效的。如果你跟CFRelease(iPhoneAddressBook);注然后尝试使用记录,我打赌它会爆炸。

最后,对于您的退出问题 - 是的,您正在泄漏ABMultiValueRef每个“创建”规则,该规则表明您拥有通过包含“创建”或“复制”的函数接收的对象。

于 2012-06-29T22:06:33.177 回答