2011-10-19 69 views
0

//獲取共享地址簿的實例 ABAddressBookRef addressBook = ABAddressBookCreate();爲什麼我的nsmutablearray屬性不保留對象?

//get all contacts in addressbook 
CFArrayRef allContacts = ABAddressBookCopyArrayOfAllPeople(addressBook); 
CFIndex numPeople = ABAddressBookGetPersonCount(addressBook); 


self.contacts = [NSMutableArray array]; 

//modify data to be stored in an array 
for (int i = 0; i < numPeople; i++) { 

    AddressBookPerson *person = [[AddressBookPerson alloc] init]; 

    ABRecordRef ref = CFArrayGetValueAtIndex(allContacts, i); 

    NSString *firstName = (NSString *)ABRecordCopyValue(ref, kABPersonFirstNameProperty); 
    NSString *lastName = (NSString *)ABRecordCopyValue(ref, kABPersonLastNameProperty); 

    ABMultiValueRef phoneNumberProperty = ABRecordCopyValue(ref, kABPersonPhoneProperty); 
    NSArray* phoneNumbers = (NSArray*)ABMultiValueCopyArrayOfAllValues(phoneNumberProperty); 
    CFRelease(phoneNumberProperty); 


    NSString *contactFirstLast = [NSString stringWithFormat: @"%@, %@", firstName, lastName]; 

    person.name = contactFirstLast; 
    person.phoneNumbers = phoneNumbers; 

    [self.contacts addObject:person]; 
    //self.contacts = [NSArray arrayWithArray:listOfContacts]; 
    [contactFirstLast release]; 
    [person release]; 

} 

我不知道爲什麼這個屬性不保留。我甚至嘗試過嘗試變化,如:

self.contacts = [[NSMutableArray alloc] init];

它被分配,但我放置在裏面的任何對象都不會被保留。我使用了一個不同的數組,它不是屬性,對象保留得很好。但問題是我需要一個全局屬性來包含值。

UPDATE:

我找到了解決問題的辦法。我跑分析,並做了參考計數,我知道它沒有內存泄漏。但問題仍然存在,這是因爲財產的名稱。

「contacts」是「可用於啓動連接和管理傳入連接請求的一組MIDI網絡主機」的內置屬性。

我給自己的房產命名了一個獨特的名字,所有的問題都消失了。沒有必要使用靜態變量,我明白,我正在使用該變量進行測試,以查看我的對象發生了什麼。靜態變量的工作原因是因爲它是唯一命名的。

+0

可以回答你自己的問題,但請不要將它作爲對別人現有答案的編輯。 –

+0

我的道歉,請記住下次。 – Toret

回答

2

簡短的回答:NSMutableArray保留對象,你的程序的實現在其引用計數有錯誤。

請刪除所有編譯器警告,然後運行靜態分析器並修復這些問題。

(靜態分析器在你的程序應該指出引用計數錯誤)

更新

靜態分析表明:

contactFirstLast << over-release 
allContacts << leaked 
firstName << leaked 
lastName << leaked 
phoneNumbers << leaked 

這涉及到一個引用計數每4行代碼問題,並有工具垂死幫助你=)

你真的不能寫一個不平凡的程序,直到你可以正確地計算ref。你應該很清楚,它是自動的。

這5個問題,我指出了可能也解決不了第一個問題是在執行過程中遇到的,但固定每在你的程序將刪除你的計劃中有許多積極的bug這些問題每個人(他們正在等待發現)。

+0

我試過這個解決方案,但我仍然遇到同樣的問題。我確實創建了一個靜態MutableArray,並保留了這些值,但是當我去訪問這些對象時,我收到了一個EXEC_BAD_ACCESS錯誤。 – Toret

+0

我看不出爲什麼你會選擇靜態在這種情況下。 – justin

0

我注意到了一件事。

您不應該釋放您尚未分配的對象。

[contactFirstLast release]; 

請刪除該行。

+0

我刪除了這一行,但不幸的是問題仍然存在。 – Toret

相關問題