2011-04-13 74 views
1

我的印象是,使用removeObjectForKey從一個NSMutableDictionary中刪除一個對象:@「someKey」釋放了被刪除的對象。但是,當我這樣做時,我的對象的dealloc方法不會被調用。我必須明確釋放它們嗎?謝謝你的幫助。removeObjectForKey:不調用dealloc

+1

你確定別的東西不保留你的對象以及字典嗎? – mbehan 2011-04-13 11:41:28

+0

確保沒有任何其他物品存在問題。在將對象添加到字典時發送'autorelease'消息。 – Eimantas 2011-04-13 11:41:28

+0

如何分配添加到字典中的對象? – diederikh 2011-04-13 11:47:09

回答

3

removeObjectForKey呼叫release - 假設,當然,前提是你@"someKey"沒有真正在字典相匹配的對象。但是,調用release不保證該對象將獲得dealloc -ed。這取決於其他所有權聲明。

由於在這種情況下dealloc消息沒有被髮送,我們可以得出結論,其他的東西有一個持續的說法。這可能是也可能不是錯誤的結果 - 例如,如果您還將對象傳遞給某個系統組件,則可能完全合法地希望將對象保留更長的時間。

如果不是的話,最可能的原因是已經沿着這些路線做了什麼:

[dictionary setObject:[[SomeClass alloc] init] forKey:@"someKey"]; 

也就是說,從來沒有放棄通過alloc授予的初始所有權。相反,這應該是這樣做的:

[dictionary setObject:[[[SomeClass alloc] init] autorelease] forKey:@"someKey]; 
+0

我想你可以閱讀我的想法!這正是我所做的(&你的修復工作) - 我沒有看到任何需要發佈的東西,我將要使用和後來發佈,所以我不認爲我很理解。當我檢查對象被初始化時,它只發生一次,爲什麼我需要釋放它兩次?就在我想我得到內存管理的時候...... – SomaMan 2011-04-13 19:33:42

+1

@Franklyn初始化只發生一次,但可以放樣多個所有權聲明 - 第一個是'alloc',然後是後續的'retain' - 這可能會作爲其他事物的副產品發生,如添加到字典中。當所有權聲明都通過匹配調用'release'而放棄時,一個對象只是'dealloc'-ed,它可能會作爲其他事物的副產品發生,特別是'autorelease',這基本上意味着「調用'釋放」一會兒」。既然你叫'alloc',你需要用'release'或'autorelease'來平衡它。 – walkytalky 2011-04-13 22:14:24

+0

謝謝 - 我想我現在明白了,毫無疑問,再過幾百小時,這些東西就會鼓起來...... :) – SomaMan 2011-04-14 09:15:44