2010-02-11 33 views
9

我已經注意到,在學習CocoaTouch在過去幾周內如何在iPhone模擬器中退出應用程序時看起來沒有調用dealloc方法。現在,公平起見,我沒有做任何太科學的事情 - 只要將可以打印到控制檯的聲明放入NSLog即可。我的問題是:dealloc在iPhone上調用嗎?

  1. 在Xcode是否斷開模擬器上的應用程序退出停止我NSLog迴盪到控制檯?

  2. dealloc是不是被稱爲優化,因爲應用程序正在退出?

  3. 當應用程序在真正的iPhone硬件上運行時,dealloc會被調用嗎?

+1

我也發現,在Mac OS X上,應用程序終止時不會調用「dealloc」。無論如何,任何正在使用的內存都將被操作系統回收。 – dreamlax 2010-02-11 23:48:52

回答

10

docs表示操作系統一次回收內存比緩存應用程序緩慢釋放所有內存塊效率更高。由於這個原因,dealloc可能不會被髮送到大量的對象;而對於這個的原因,重要的是不要管理dealloc中的稀缺資源。要清理稀缺資源,讓應用程序代理響應applicationWillTerminate:並在那裏進行清理可能是一個更好的主意。

- (void) applicationWillTerminate:(NSApplication/UIApplication *) anApp 
{ 
    [scarceResourceManager relinquishScarceResources]; 
} 
+3

生硬:當應用程序終止時花費CPU週期調用'free()'或'-deallocate'是完全浪費資源。 Mac OS X和iPhone都使用內存模型,其中每個進程都保持獨立。當一個進程終止時,與該應用程序相關的所有*內存資源將一次性全部回收。 – bbum 2010-02-12 04:11:22

+0

謝謝dreamlax和bbum,它的一些東西一直在竊聽我一段時間,非常感謝。 – fuzzygoat 2010-02-12 09:20:21

+0

dreamlax和bbum都是對的。終止釋放內存是浪費,但重要的是除了釋放內存以外終止時有很多事情要做。這篇文章對這些案例很有價值。 – Eonil 2010-04-20 12:20:06

0

正如dreamlax所說,只要應用程序退出,系統就會收回所有內存。所以在退出時,應用程序無法調用dealloc。這是Mac OS X上的標準行爲,我懷疑它會在iPhone上變得不同 - 模擬或「真實」。