2013-04-22 58 views
0

下6個免費的malloc-ED存儲器如何ARC下釋放在Objective-C動態分配的存儲器?iOS 5及ARC

通過dynamically我的意思是內存malloc分配給一些伊娃。

deallocviewDidUnload不再被調用,至少通過我的測試。

所以當視圖控制器,不再需要時,以及如何開始釋放內存?

我所做的就是創建一個名爲Releasable的協議(我從C#中竊取的一個想法),它具有單一方法-(void) release。 當對象不再需要時,這將由一些外部代理調用。

+0

究竟爲什麼你想這樣做嗎?使用ARC時,只要不再有任何引用,內存就可用於分配。應該不需要手動處理這種情況。 – ZekeTheGeek 2013-04-22 20:22:01

+1

'viewDidUnload'例程不再被調用,因爲iOS不再在'didReceiveMemoryWarning'上自動釋放視圖。即使在iOS 6天之前,當系統有內存警告時,也只調用viewDidUnload。就我個人而言,我傾向於用你的控制器的'dealloc'方法調用你的'free'調用。或者,更好的是,看看你是否可以完全避免「malloc」調用。 – Rob 2013-04-22 20:22:37

+1

@ZekeTheGeek我正在使用OpenGL ES 2.0並創建頂點。它們是普通的C結構。由於我需要速度和空間,我不想將50000多個頂點打包成NSValue或類似的。 – 2013-04-22 20:27:53

回答

7

dealloc仍然ARC下調用。你只是不明確地致電[super dealloc]。如果dealloc沒有被調用,那麼仍然有一個對象實例的引用。在你的項目上運行分析儀,看看會發生什麼。

viewDidUnload仍然iOS 5的下稱爲但不是的iOS 6.下

將您的協議和您的release方法是完全不必要的。

+0

我一直在把'NSLog's放到'dealloc'中,並沒有看到任何在應用程序端被調用。我必須再檢查一下。我也會運行分析器。 – 2013-04-22 20:31:05

+0

+1 @rmaddy - 順便說一句,我讀了他的意見爲代表的誤解時'viewDidUnload'被稱爲iOS版5.他的言論似乎表明,他認爲這是一個一般的清理程序時的意見被駁回,但如你所知,事實並非如此。當控制器的視圖在內存不足的情況下被釋放時,這是一個特殊目的例程,但是當視圖被解除/彈出時,在標準操作期間不會調用它。 – Rob 2013-04-22 20:31:09

+2

@MartinBerger如果你的'dealloc'例程沒有被調用,那麼你可能有保留週期(強參考週期),例如,當你不重複'NSTimer'使''失效時,或者如果呈現控制器保留(即保持強有力的參考)呈現的控制器。但'dealloc'絕對是你清理的好地方。你只需要弄清楚爲什麼它沒有被調用(如果不是)。 – Rob 2013-04-22 20:33:40