Objective-C:从NSData导入大量联系人时的内存问题

时间:2016-04-11 21:03:28

标签: ios objective-c memory import-contacts

我尝试使用以下代码从ARC中的NSData对象导入联系人:

- (void) importAllVcard: (NSData *)VcardData
{
    NSString *vCardString = [[NSString alloc] initWithData:VcardData encoding:NSUTF8StringEncoding];
    CFDataRef vCardData = (__bridge CFDataRef)[vCardString dataUsingEncoding:NSUTF8StringEncoding];

    ABAddressBookRef book = ABAddressBookCreate();
    ABRecordRef defaultSource = ABAddressBookCopyDefaultSource(book);
    CFArrayRef vCardPeople = ABPersonCreatePeopleInSourceWithVCardRepresentation(defaultSource, vCardData);

    NSArray *array = (__bridge NSArray*)vCardPeople;
    for (CFIndex index = 0; index < CFArrayGetCount(vCardPeople); index++) {
        @autoreleasepool {
            ABRecordRef person = CFArrayGetValueAtIndex(vCardPeople, index);
            ABAddressBookAddRecord(book, person, NULL);
        }
    }

    CFRelease(vCardPeople);
    CFRelease(defaultSource);
    CFRelease(book);
}

但是在进行任何导入操作之前,我都遇到了问题。

如果我要导入50,000个联系人,当我的代码尝试使用CFArrayRef为我的联系人数据创建ABPersonCreatePeopleInSourceWithVCardRepresentation时,内存将不断增加并达到近250MB(Xcode内存调试导航器数据)

这对我来说太高了,因为我同时运行其他任务可能会占用大量内存。所以我想在开始导入之前减少内存使用量。

我试图通过释放一些CFReferences来减少内存,这些CFReferences在导入循环之前导入大型CFArrayRef之类的联系人时不需要,但内存不会下降。

出于测试目的,我注释掉了导入循环,只获取了联系人的数组。当整个过程完成后,这个视图控制器将消失,然后下一个视图控制器显示出来,然后内存回到80MB。

在我开始导入保存在NSArray中的联系人而不更改视图控制器之前,有没有办法将内存减少到接近80MB的水平。

0 个答案:

没有答案