我尝试使用以下代码从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的水平。