【问题标题】:iOS - Memory leak AddressBookiOS - 内存泄漏地址簿
【发布时间】:2023-03-27 21:38:01
【问题描述】:

当我在我的应用程序中发现一些不同类型的内存泄漏时,我正在处理 AddressBook 框架:

Leaked Object   #   Address Size    Responsible Library Responsible Frame
__NSCFArray 8   < multiple >    256 Bytes   AddressBook ABCMultiValueInsertAndCreateIdentifier
__NSCFString    7   < multiple >    224 Bytes   AppSupport  _sqliteStatementApplyValuesFromRecordWithNullValue
Malloc 32 Bytes 8   < multiple >    256 Bytes   AddressBook ABCMultiValueInsertAndCreateIdentifier
__NSCFArray 8   < multiple >    256 Bytes   AddressBook ABCMultiValueInsertAndCreateIdentifier
ABCMultiValue   8   < multiple >    256 Bytes   AddressBook ABCMultiValueCreate
Malloc 32 Bytes 7   < multiple >    224 Bytes   AddressBook ABCMultiValueInsertAndCreateIdentifier
__NSCFArray 7   < multiple >    224 Bytes   AddressBook ABCMultiValueInsertAndCreateIdentifier
Malloc 32 Bytes 5   < multiple >    160 Bytes   AddressBook ABCMultiValueInsertAndCreateIdentifier

这是我的代码:

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person {

    SDAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];

    ABMultiValueRef multiRef = ABRecordCopyValue(person, kABPersonPhoneProperty);
    NSString *number = (__bridge NSString *) ABMultiValueCopyValueAtIndex(multiRef, 0);
    NSString *firstname = (__bridge NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty);
    NSString *lastname = (__bridge NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty);

    number = (number ? number : @"");
    firstname = (firstname ? firstname : @"");
    lastname = (lastname ? lastname : @"");

    NSDictionary *dic = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:number, firstname, lastname, nil] forKeys:[NSArray arrayWithObjects:kSDPhoneNumberKey, kSDFirstnameKey, kSDLastnameKey, nil]];

    NSMutableArray *numberArray = [NSMutableArray arrayWithArray:appDelegate.contactArray];
    [numberArray addObject:dic];

    [appDelegate setContactArray:numberArray];

    [self.tableView reloadData];

    [self dismissModalViewControllerAnimated:YES];

    return NO;
}

有人知道哪些线路是造成这些泄漏的原因吗?

【问题讨论】:

    标签: ios memory memory-leaks addressbook


    【解决方案1】:

    一般来说,任何名称中包含Copy 或Create 的Core Foundation 方法都应该将所有权转移给您的ARC 对象,或者您必须自己调用CFRelease。因此,您应该转让您的三个NSString 对象的所有权,并手动释放multiRef。

    要将所有权转移给 ARC,您应该使用 CFBridgingRelease,根据 WWDC 2012 - Modern Objective-C(视频大约 37:35),现在比以前的技术 __bridging_transfer 更受欢迎(尽管在幕后,他们是同一件事)。

    无论如何,你的三个NSString 对象的声明应该是:

    NSString *number = CFBridgingRelease(ABMultiValueCopyValueAtIndex(multiRef, 0));
    NSString *firstname = CFBridgingRelease(ABRecordCopyValue(person, kABPersonFirstNameProperty));
    NSString *lastname = CFBridgingRelease(ABRecordCopyValue(person, kABPersonLastNameProperty));
    

    这相当于:

    NSString *number = (__bridge_transfer NSString *) ABMultiValueCopyValueAtIndex(multiRef, 0);
    NSString *firstname = (__bridge_transfer NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty);
    NSString *lastname = (__bridge_transfer NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty);
    

    另外,别忘了也发布multiRef:

    CFRelease(multiRef);
    

    顺便说一句,如果您运行静态分析器,我相信它会为您指出这些。从“产品”菜单中选择“分析”,或按shift+command+B。

    【讨论】:

    • 哇,非常感谢!没有更多的内存泄漏和分析工具是惊人的,我不知道它在那里!
    猜你喜欢
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-09
    • 2016-10-16
    • 2014-06-06
    • 2011-04-29
    相关资源
    最近更新 更多