2011-08-12 59 views
2

我創建了一個將對象映射到整數的NSDictionary,並且由於NSDictionaries除了對象之外不處理任何對象,所以我必須用[NSNumber numberWithInt:30]來包裝NSNumber對象中的每個整數,或者你有什麼。我不清楚的是我是否需要釋放所有我創建的NSNumber對象。我實際上並沒有爲它們分配空間,所以它們必須位於autorelease池中,但是我可以確定NSDictionary對象正在保留並正確釋放它們嗎?比方說,我設置我是否需要將NSNumbers自己添加到NSDictionary中?

NSDictionary * myDict = [[NSDictionary alloc] initWithObjectsAndKeys: objectOne, [NSNumber numberWithInt: 30], nil]; 

,我正確釋放的NSDictionary時,我用它做(因爲我上午 alloc'ing我自己的代碼中對於空間)。

回答

2

nope NSNumber對象是autoreleased。

將它們添加到NSDictionary將導致將保留消息發送到您添加的每個NSNumber對象。

根據內存管理規則,你不擁有這些對象 - NSDictionary以某種方式做 - 因此你不負責釋放它們,NSDictionary對象將做到這一點。

但是您擁有使用alloc & initWithObjectsAndKeys創建的NSDictionary :.因此,您需要注意管理myDict對象的內存。

+1

numberWithInt是一種方便的方法(即在類上調用它)。因此,由於您沒有調用稱爲initXXX的方法,因此根據內存管理規則,該對象將返回自動釋放。 – Oli

+0

正確。但你需要檢查是否有必要手動釋放它或使用自動釋放機制 - 後者適用於這種情況 – Wizz

1

不,你做得很好。

您正在將一個自動釋放的NSNumber添加到字典中。字典將保留NSNumber,所以當它最終自動釋放時,它仍然是有效的。

然而,只有幾點,所以你不會疏忽大意。你意識到NSNumber是關鍵,objectOne是存儲在字典中的值?這是可以的,因爲NSNumber符合NSCopying協議,這是用作鍵的對象的要求。

+0

啊,你是對的,NSDictionary初始化了這種方式需要在對象對中值 - 鍵 - 值 - 鍵,而不是鍵值鍵值。雖然這對我的目的無關緊要。我仍然不清楚究竟* *我知道NSDictionary將保留進入的自動釋放對象。這只是對象必須設計的目的 - 這意味着我必須檢查可能包含另一個對象的任何對象的文檔?還是有一些其他的概括我可以用來告訴該怎麼做? – Tneuktippa

+2

所有集合保留其對象。想想你會怎麼做。把它看作屬性 - 你寫一個帶有屬性的自定義類,你將這些屬性設置爲對象,並且你的類保留它的屬性。這顯示在iOS上。你的應用程序的主窗口保留它的視圖控制器,視圖保留它們的子視圖,當你顯示一個模式視圖控制器時,它也被保留下來。基本上; iOS保留了它需要保留的任何東西,無論是集合中的對象還是視圖控制器。 – Abizern

+0

我的意思是說 - 「你會習慣它」 – Abizern

相關問題