我正在尝试使用以下代码从 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 内存调试导航器数据)。
这对我来说太高了,因为我有其他任务同时运行可能会占用很大的内存。所以我想在开始导入之前减少内存使用量。
我试图通过释放一些在导入循环之前导入如此大的联系人时不需要的 CFReference 来减少内存CFArrayRef
,但内存不会下降。
出于测试目的,我将导入循环注释掉,只获取联系人数组。当整个过程完成后,这个视图控制器会消失,并出现下一个视图控制器,然后内存恢复到 80MB。
NSArray
在我开始导入保存的联系人而不更改视图控制器之前,是否有任何可能的方法将内存减少到近 80MB 级别。