2011-11-03 47 views

回答

15

在所有病例的99.9%中,沒有必要觸摸main.m

在另外的0.1%中,您可能需要將呼叫的參數更改爲UIApplicationMain()函數。該函數的最後兩個參數指定代表主應用程序的類的名稱(默認爲UIApplication)和應用程序委託。

如果您決定子類UIApplication,您可以將第三個參數設置爲您的子類名稱。如果您想截取您的應用處理的某些事件(覆蓋sendEvent:),子類UIApplication可能會很有用。

如果您只是決定重命名該類,則您的應用程序委託類的名稱可能會更改。另外,如果UIApplicationMain()的第四個參數是nil(這是在iOS 5中未使用Storyboarding的項目模板中的默認值),則表示您在應用程序的主要NIB文件中創建了您的應用程序委託對象。如果你決定改變這個決定(例如,爲了適應現有項目的Storyboarding),你將不得不改變第四個參數來告訴UIApplicationMain()它應該實例化的類的名字。

+0

我認爲有800,000個應用程序。 .1%是800!可能是正確的。 – Fattie

0

一般來說,你不需要觸摸main.m文件。這是所有樣板代碼。任何初始化通常在您的應用程序委託中完成。

10

在某些情況下,您可能需要修改此文件。默認情況下,iOS開發模板假設你將使用Interface Builder來提供你的初始界面,並在下面用零值作爲最後一個參數的情況下這樣做UIApplicationMain(),如:

return UIApplicationMain(argc, argv, nil, nil); 

如果您希望以編程方式contruct你的界面,您可能需要使用最後一個參數指定您的應用程序委託類:

return UIApplicationMain(argc, argv, nil, NSStringFromClass([SPAppDelegate class])); 

這是爲了讓應用程序知道在哪裏可以構建你的界面開始。使用Interface Builder構建一個,您可以通過您的Info.plist鍵之一來指示要使用哪個IB文件作爲基礎。

如果你之前自動引用計數創建一個main.m文件,你可能有一個包裝此功能的明確NSAutoreleasePool:

NSAutoreleasePool *pool = [NSAutoreleasePool new];  
int retval = UIApplicationMain(argc, argv, nil, NSStringFromClass([SPAppDelegate class])); 
[pool release]; 
return retval; 

根據ARC,這將被轉換爲@autoreleasepool

@autoreleasepool { 
    int retVal = UIApplicationMain(argc, argv, nil,NSStringFromClass([SPAppDelegate class])); 
    return retVal; 
} 

這是我以任何方式編輯main.m文件的唯一兩種情況。

相關問題