2011-07-05 39 views
9

我重新閱讀UIApplicationMain文件,並想知道,如果UIApplicationMain永遠不會返回,原因是:爲什麼iOS main.m模板包含return語句和autorelease池?

  • 是有return末?
  • 有沒有NSAutoreleasePool

我甚至問自己:爲什麼int main(int argc, char *argv[])在iPhone上? 我們可以用命令行啓動應用嗎?什麼是argcargv?他們是使用還是僅僅遺留C?

一些從光榮的研究員在Twitter上評論是:

  • return是這裏的編譯器
  • NSAutoreleasePool是沒用的。
  • 運行循環需要分配一個自動釋放池(矛盾#2)

回答

4

1)return語句可能只是那裏,因爲編譯器不知道該函數永遠不能返回(它不是畢竟,以任何特殊的方式標記)。因此,編譯器的代碼流分析會警告它缺少返回語句。這仍然無法解釋爲什麼UIApplicationMain()具有返回值。也許有一個錯誤情況,其實可以返回,誰知道呢。 2)我認爲在UIApplicationMain的main()中有一個autorelease池是錯誤的,因爲任何沒有池的對象都會在這個自動釋放池中結束,這個池在應用程序的整個持續時間內都會持續存在。如此有效的對象仍然泄漏。

通常,如果不存在自動釋放池,運行時會記錄有關缺失池的錯誤消息,並通知開發人員在_NSAutoreleaseNoPool上設置斷點以查找無池自動釋放的位置。在模板中找到的頂級NSAutoreleasePool實際上是,它隱藏了這個漏洞。如果需要的話,UIApplicationMain()應該建立自己的自動釋放池(無論如何它必須通過事件循環創建和拆除一個池,否則對象只會累加到外部池中,消耗所有內存)。如果有人認爲他們確實需要在調用UIApplicationMain()之前運行ObjC代碼(並且他們無法在applicationDidFinishLaunching中執行相同的工作),則他們始終可以在 UIApplicationMain()之前創建一個池。由於UIApplicationMain()被記錄爲永遠不會返回(比如exit()),因此無論如何都不需要在後面執行命令。游泳池永遠不會被釋放。

如果你看看Mac模板,他們實際上沒有游泳池。

3)即使雙擊Mac上的應用程序,也可以使用這些參數。操作系統以某種方式將某些信息傳遞給應用程序。第一個參數是可執行文件啓動時的路徑,這對於查找包中的文件是很有必要的,我猜想。在Mac上,在PSN(過程序列號)也將傳遞到一個應用程序從Finder啓動時的參數:

05.07.11 22:18:54,129 [0x0-0x21e21e].com.thevoidsoftware.MacTestApp: 0: /Volumes/RamDisk/MacTestApp-fdcuwfrzopalmgaufwujijhqhvjc/Build/Products/Debug/MacTestApp.app/Contents/MacOS/MacTestApp 
05.07.11 22:18:54,129 [0x0-0x21e21e].com.thevoidsoftware.MacTestApp: 1: -psn_0_2220574 
+0

關於Mac模板,可能是因爲它們使用垃圾回收(而不是引用計數環境)?在iOS上,我們沒有它。 –

+1

@Cyril Godefroy只有懶惰的開發者使用垃圾回收,默認情況下它沒有啓用。我討厭它,但那是我的意見。 – 2011-07-05 20:25:43

+0

如果您有權訪問預發行軟件,您可以自己回答該問題。我不能再多說了。 – uliwitness

0

在參數的一部分,在iOS上,如果您啓動直接的應用程序,你只能得到一個參數,應用程序路徑

2011-07-05 22:38:15.004 iCyril[2326:707] There are 1 args 
Argument 1 : /var/mobile/Applications/7D58CC99-89C3-4F86-93D9-5FAF0756B706/iCyril.app/iCyril 

既然你可以打開的文件,從UIApplication的委託方法讀取網址等其他信息必須由相同的機制來處理。

+0

不太可能。這將無法使用已運行的應用程序打開文檔或URL。在MacOS上,Apple Events用於告訴應用程序打開文件/ URL。反過來,這些都是基於馬克引擎蓋下的這些天。我認爲iOS在內部具有相同的東西。 – uliwitness