我的印象是,使用removeObjectForKey從一個NSMutableDictionary中刪除一個對象:@「someKey」釋放了被刪除的對象。但是,當我這樣做時,我的對象的dealloc方法不會被調用。我必須明確釋放它們嗎?謝謝你的幫助。removeObjectForKey:不調用dealloc
回答
removeObjectForKey
將呼叫release
- 假設,當然,前提是你@"someKey"
沒有真正在字典相匹配的對象。但是,調用release
不保證該對象將獲得dealloc
-ed。這取決於其他所有權聲明。
由於在這種情況下dealloc
消息沒有被髮送,我們可以得出結論,其他的東西有一個持續的說法。這可能是也可能不是錯誤的結果 - 例如,如果您還將對象傳遞給某個系統組件,則可能完全合法地希望將對象保留更長的時間。
如果不是的話,最可能的原因是已經沿着這些路線做了什麼:
[dictionary setObject:[[SomeClass alloc] init] forKey:@"someKey"];
也就是說,從來沒有放棄通過alloc
授予的初始所有權。相反,這應該是這樣做的:
[dictionary setObject:[[[SomeClass alloc] init] autorelease] forKey:@"someKey];
我想你可以閱讀我的想法!這正是我所做的(&你的修復工作) - 我沒有看到任何需要發佈的東西,我將要使用和後來發佈,所以我不認爲我很理解。當我檢查對象被初始化時,它只發生一次,爲什麼我需要釋放它兩次?就在我想我得到內存管理的時候...... – SomaMan 2011-04-13 19:33:42
@Franklyn初始化只發生一次,但可以放樣多個所有權聲明 - 第一個是'alloc',然後是後續的'retain' - 這可能會作爲其他事物的副產品發生,如添加到字典中。當所有權聲明都通過匹配調用'release'而放棄時,一個對象只是'dealloc'-ed,它可能會作爲其他事物的副產品發生,特別是'autorelease',這基本上意味着「調用'釋放」一會兒」。既然你叫'alloc',你需要用'release'或'autorelease'來平衡它。 – walkytalky 2011-04-13 22:14:24
謝謝 - 我想我現在明白了,毫無疑問,再過幾百小時,這些東西就會鼓起來...... :) – SomaMan 2011-04-14 09:15:44
- 1. MyOpenGLView的dealloc不調用
- 2. UIViewController不調用dealloc或調用兩次
- 3. dealloc調用混淆
- 4. dealloc調用兩次
- 5. Dealloc調用但活內存不減
- 6. Dealloc發佈後不立即調用
- 7. 爲什麼dealloc不被調用?
- 8. NSUserDefaults removeObjectForKey與setObject:無
- 9. 何時調用dealloc方法?
- 10. 過早調用Dealloc方法
- 11. UIDocument從未調用的dealloc
- 12. viewDidUnload在dealloc之後調用?
- 13. dealloc仍然被調用嗎?
- 14. Dealloc調用UIView子類
- 15. dealloc在viewDidUnload後被調用
- 16. dealloc在iPhone上調用嗎?
- 17. 是否有dealloc調用不調用viewWillDisappear的情況?
- 18. 在不調用viewDidUnload的情況下調用popViewControllerAnimated後的Dealloc
- 19. 如果調用NSURLSessionTask resume,則不調用對象dealloc
- 20. 子視圖沒有調用dealloc當超級查看(UIViewController)dealloc
- 21. cancelPreviousPerformRequestsWithTarget不dealloc的
- 22. 如何調試viewDidDisappear或dealloc?
- 23. Xamarin上的UIViewController沒有調用dealloc
- 24. iphone SDK:未調用UIView dealloc。爲什麼?
- 25. SEGV_ACCERR調用[[NSNotificationCenter defaultCenter] removeObserver:self] in dealloc
- 26. UIViewController&UIview dealloc沒有被調用
- 27. 未調用UIView子類的Dealloc方法
- 28. Dealloc沒有在超類中調用
- 29. appdelegate dealloc只會被調用一次?
- 30. 方法可能缺少[super dealloc]調用
你確定別的東西不保留你的對象以及字典嗎? – mbehan 2011-04-13 11:41:28
確保沒有任何其他物品存在問題。在將對象添加到字典時發送'autorelease'消息。 – Eimantas 2011-04-13 11:41:28
如何分配添加到字典中的對象? – diederikh 2011-04-13 11:47:09