访问电话簿时ios内存泄漏

屏幕

- (NSArray *)getAllContacts{ CFErrorRef *error = nil; ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, error); __block BOOL accessGranted = NO; if (ABAddressBookRequestAccessWithCompletion != NULL) { // we're on iOS 6 dispatch_semaphore_t sema = dispatch_semaphore_create(0); ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) { accessGranted = granted; dispatch_semaphore_signal(sema); }); dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); } else { // we're on iOS 5 or older accessGranted = YES; } if (accessGranted == YES) { #ifdef DEBUG NSLog(@"Fetching contact info ----> "); #endif ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, error); ABRecordRef source = ABAddressBookCopyDefaultSource(addressBook); CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering(addressBook, source, kABPersonSortByFirstName); CFIndex nPeople = ABAddressBookGetPersonCount(addressBook); NSMutableArray* items = [NSMutableArray arrayWithCapacity:nPeople]; for (int i = 0; i < nPeople; i++) { ContactsData *contacts = [ContactsData new]; ABRecordRef person = CFArrayGetValueAtIndex(allPeople, i); //get First Name and Last Name contacts.firstNames = (__bridge NSString*)ABRecordCopyValue(person, kABPersonFirstNameProperty); contacts.lastNames = (__bridge NSString*)ABRecordCopyValue(person, kABPersonLastNameProperty); if (!contacts.firstNames) { contacts.firstNames = @""; } if (!contacts.lastNames) { contacts.lastNames = @""; } // get contacts picture, if pic doesn't exists, show standart one // NSData *imgData = (__bridge NSData *)ABPersonCopyImageData(person); // contacts.image = [UIImage imageWithData:imgData]; // if (!contacts.image) { // contacts.image = [UIImage imageNamed:@"NOIMG.png"]; // } // //get Phone Numbers // // NSMutableArray *phoneNumbers = [[NSMutableArray alloc] init]; // // ABMultiValueRef multiPhones = ABRecordCopyValue(person, kABPersonPhoneProperty); // for(CFIndex i=0;i<ABMultiValueGetCount(multiPhones);i++) { // // CFStringRef phoneNumberRef = ABMultiValueCopyValueAtIndex(multiPhones, i); // NSString *phoneNumber = (__bridge NSString *) phoneNumberRef; // [phoneNumbers addObject:phoneNumber]; // // //NSLog(@"All numbers %@", phoneNumbers); // // } // [contacts setNumbers:phoneNumbers]; //get Contact email NSMutableArray *contactEmails = [NSMutableArray new]; ABMultiValueRef multiEmails = ABRecordCopyValue(person, kABPersonEmailProperty); for (CFIndex i=0; i<ABMultiValueGetCount(multiEmails); i++) { CFStringRef contactEmailRef = ABMultiValueCopyValueAtIndex(multiEmails, i); NSString *contactEmail = (__bridge NSString *)contactEmailRef; [contactEmails addObject:contactEmail]; // NSLog(@"All emails are:%@", contactEmails); } [contacts setEmails:contactEmails]; //---- if no mail id found then dont add contact if (contactEmails && contactEmails.count != 0) { [items addObject:contacts]; } #ifdef DEBUG // NSLog(@"Person is: %@ # %@", contacts.firstNames,contacts.lastNames); // NSLog(@"Phones are: %@", contacts.numbers); // NSLog(@"Email is:%@", contacts.emails); #endif } return items; } else { #ifdef DEBUG NSLog(@"Cannot fetch Contacts :( "); #endif return nil; } } 

崩溃日志:8月6日19:11:08 IPad:获取联系信息—->

8月6日19:11:08 IPad :(警告)[ABLog]:实际默认来源不存在

8月6日19:11:57 IPad com.apple.debugserver-310.2 [449]:得到一个’k’数据包,杀死了劣质进程。

8月6日19:11:57 IPad com.apple.debugserver-310.2 [449]:发送ptrace PT_KILL以终止劣质进程。

8月6日19:11:57 IPad com.apple.debugserver-310.2 [449]:38 +82.923904 sec [01c1 / 060b]:error ::: ptrace(request = PT_THUPDATE,pid = 0x01c2,tid = 0x2603,signal = 0 )err =资源忙(0x00000010)

8月6日19:11:57 IPad com.apple.debugserver-310.2 [449]:39 +0.005248 sec [01c1 / 060b]:error ::: task_info(target_task = 0x1c0b,flavor = TASK_BASIC_INFO,task_info_out => 0x27d93d48,task_info_outCnt = > 8)err =(os / kern)无效参数(0x00000004)

8月6日19:11:57 IPad com.apple.launchd 1 (UIKitApplication:com.baltech.gaurav [0x7f50] [450]):( UIKitApplication:com.baltech.gaurav [0x7f50])已退出:已杀:9

8月6日19:11:57 IPad com.apple.debugserver-310.2 [449]:等待20毫秒收集进程(state =退出)

8月6日19:11:57 IPad com.apple.debugserver-310.2 [449]:40 +0.025414 sec [01c1 / 1207]:error ::: read(-1,0x4089ec,18446744069414585344)=> -1 err =错误的文件描述符(0x00000009)

8月6日19:11:57 IPad com.apple.debugserver-310.2 [449]:退出。

8月6日19:11:57 IPad backboardd [28]:应用程序’UIKitApplication:com.baltech.gaurav [0x7f50]’exception退出,信号9:被杀:9

– 提前致谢

__bridge_transfer替换__bridge

 contacts.firstNames = (__bridge_transfer NSString*)ABRecordCopyValue(person, kABPersonFirstNameProperty); 

参考Apple Docs :

__bridgeCFRelease在Objective-C和Core Foundation之间传输指针,不转让所有权。

__bridge_transferCFBridgingRelease将非Objective-C指针移动到Objective-C,并将所有权转移到ARC。 ARC负责放弃对象的所有权。