2015-02-23 26 views
1

我有一個代碼行,並且我在下面提到的一致性行爲崩潰。在CFRelease期間exc_bad_exception

ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, error); 
    ABRecordRef source = ABAddressBookCopyDefaultSource(addressBook); 
    CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering(addressBook, source, kABPersonSortByFirstName); 
    CFIndex nPeople = ABAddressBookGetPersonCount(addressBook); 
    for (...) { 
     ABRecordRef person = CFArrayGetValueAtIndex(allPeople, i); 
     ... 
     CFRelease(persn) 
    } 
    CFRelease(source); 
    CFRelease(allPeople); 
    CFRelease(addressBook); 

我一直得到最後一行CFRelease(addressBook); 錯誤。然而,

如果我刪除線CFRelease(person)裏面的for循環,然後我停在最後一行

你會知道越來越壞訪問錯誤,爲什麼是這樣呢?

以上代碼中CFRelease可能的候選對象是什麼?爲什麼?

回答

2

無需發佈人。

ABAddressBook 創建 WithOptions - >需要

ABAddressBook 複製 DefaultSource - >需要

CFArray 獲取 ValueAtIndex - >不必

一旦釋放allPeople,所有將被釋放。