2009-12-18 92 views
1

這行代碼: [mymutabledict setObject:myclassobj forKey:myclassobj.myidstring];的NSMutableDictionary的setObject給「消息發送到釋放實例」錯誤

是給這個錯誤:

*** -[NSCFString hash]: message sent to deallocated instance 0x3c14610

我把在該線路上的一個斷點,我檢查並且所有3個對象(mymutabledict,myclassobj和myclassobj.myidstring)在調試器中正確分配並正確可見。還有什麼可能導致這個錯誤?這可能與我用來將以前的項目放到字典中的對象或鍵有關嗎?

我甚至檢查過,使用的密鑰與任何先前輸入的密鑰都不匹配。

有一點額外的信息:我從SQL數據庫加載對象到內存中的可變字典。這段代碼對於幾周的幾組樣本數據都工作得很好,直到今天,這個代碼都有一個特定的數據庫副本。謝謝!

+0

地址0x3c14610是否對應於三個對象中的任何一個? – TechZen 2009-12-18 05:14:12

+0

沒有。抱歉,我忘了提及我檢查了它,但它不符合這3個對象中的任何一個。 – mjdth 2009-12-18 05:16:32

+0

DB的這個副本有什麼獨特之處,對其他人不是這樣嗎?它是否更大?包含重複項? – benzado 2009-12-18 08:05:17

回答

3

你好像在某事上多次撥打release。在該行上方添加以下代碼:

for (NSString *key in mymutabledict) { 
    NSLog(@"Key %@ maps to %@.", key, [mymutabledict objectForKey:key]); 
} 
NSLog(@"About to add %@", myclassobj); 
NSLog(@" with key %@", myclassobj.myname); 

...並查找崩潰的對象。

將對象添加到NSDictionary/NSMutableDicitonary對象時,鍵被複制而不是保留。如果您要從字典中拉出鍵並釋放它們(例如,在上面的代碼中調用[key release]或通過[mymutabledict allKeys]獲取字符串對象),那可能會這樣做。

+0

我認爲這是導致答案。使用你的代碼我已經注意到當嘗試將具有重複ID的項目添加到字典時發生問題。現在,我必須找到一種方法,在嘗試在那裏存儲新對象之前,檢查字典是否有該鍵的某些內容... – mjdth 2009-12-18 08:17:28

+0

就是這樣。我最終做的是創建一個可變數組並存儲我用於鍵的所有值,以確保我不將多個對象分配給同一個鍵。它似乎已經解決了這個問題,但我不知道爲什麼。 – mjdth 2009-12-18 08:24:20

1

NSZombieEnabled運行程序。當保留計數達到0時,NSZombieEnabled將對象的類型(在您的情況下是NSMutableDictionary)更改爲NSZombie對象。每當將消息發送到此殭屍對象時,程序立即崩潰,讓您準確查看問題發生的位置。

+0

請按照以下鏈接瞭解如何確定何時過度使用哪種方法。這將幫助你瞄準你的努力。 – 2009-12-18 08:13:32

1

你如何定義「myidstring」屬性?由於它是一個NSString,因此您已將其聲明爲「@property(retain)」,以保持其引用的有效性。

相關問題