0

我正在閱讀地址簿聯繫人......一切都很順利,直到我測試了一個沒有 的聯繫人名字(因爲我只能通過電子郵件或電話或觀看者創建聯繫人... )。 代碼(減少)是這樣的:kABPersonFirstNameProperty ... trowing EXC_BAD_ACCESS

- (NSMutableArray *) getContactsInfo { 
    NSMutableArray *contactsList = [[NSMutableArray alloc] init]; 
    localAddressBook = ABAddressBookCreate(); 

    int contactsLength = (int)ABAddressBookGetPersonCount(localAddressBook); 

    if (contactsLength < 1) 
     return nil; 

    for(int currentContact=1; currentContact < (contactsLength + 1); currentContact++) { 
     ABRecordRef person = ABAddressBookGetPersonWithRecordID(localAddressBook,(ABRecordID) currentContact); 

     firstName = (NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty); 
     NSLog(@"%@", firstName); 

     [contactsList addObject:firstName]; 
     CFRelease(person); 
    } 

    return contactsList; 
} 

和輸出我得到的是這樣的:

2010-02-15 14:16:25.616 testApp[7065:207] Contact0 
2010-02-15 14:16:25.618 testApp[7065:207] Contact1 
2010-02-15 14:16:25.619 testApp[7065:207] Contact2 
Program received signal: 「EXC_BAD_ACCESS」. 

我有一個名和姓 而一個只用姓氏創建3個觸點,出於測試目的。

看來我可以正確讀取任何屬性,如電子郵件或地址與數組......但是當一個聯繫人缺少名字屬性應用程序崩潰。

+1

控制檯說了什麼? – kennytm 2010-02-15 19:16:57

回答

0

要確保,崩潰正在內ABRecordCopyValue,而不是地方當您嘗試使用firstName首次(可以爲NULL?)另外,person不爲空或者,是否正確?

另一件事,試圖將投personABRecord*,並使用[valueForProperty][1](在約哪一行崩潰將是有益的細節一起的問題一般更多的代碼。);這兩種類型的免費橋接,你可能會得到不同的結果(雖然我懷疑它)。

更新:鑑於你已經發布,你需要檢查firstName代碼不是NULL通過NSLog試圖輸出它 - 它很可能ABRecordCopyValue被簡單地返回NULL(代表其實也沒有名數據)您還應該檢查參考值本身的有效性 - 將NULL傳遞給ABRecordCopyValue可能是其他問題的根源。

+0

我是新來的這個委員會,我嘗試發佈的代碼看起來很難看。 請看看這個鏈接從 PasteBin。com [直到我學會如何發佈代碼= /] http://pastebin.com/ma738189 – Octavio 2010-02-15 20:35:38

0

這個問題確實是一個零的名字 - 但不是在日誌語句,而是你試圖插入到數組中的nil。你不能在數組中插入一個零值,導致崩潰。 NSLog沒有將輸出刷新到控制檯,這就是爲什麼你還沒有看到你的最後一條日誌聲明,說名字是零。

任何時候當你從地址簿中獲取數據時,檢查數值是否爲零,然後將其插入任何東西。

4

你在代碼中做了一件非常錯誤的事情:你假定記錄ID是連續的,並且從1開始。事實並非如此,你不能依賴這個。

您應該做的是使用ABAddressBookCopyArrayOfAllPeople查找地址簿中的所有記錄,然後使用Core Foundation CFArray函數獲取單個項目。

(是的,iPhone中的地址簿API太糟糕了)

+0

是的!這是爲我工作的答案。我使用的是遍歷記錄數組並通過索引請求它們的代碼。大錯。將CFArray投射到一個NSArray上,然後迭代它就是爲我修復的。 – Wyllys 2014-03-19 02:27:18

+0

你能否更新你的代碼?會有幫助:) – user1147981 2014-10-09 08:37:01