Xcode4.2之前的main函數如下:
int main(int argc,
char *argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool
alloc] init];
int retVal = UIApplicationMain(argc, argv,
nil, nil);
[pool
release];
return retVal;
}
Xcode4.2工程中的主函數為
int main(int argc,
char *argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([TCAppDelegate class]));
}
}
可以看出一個重要的變化是在4.2使用了ARC技術後,NSAutoreleasePool被廢棄,改用@autoreleasepool,這裡請不要該回原先的方式,如果改變後,在開啟ARC選項後,程式將不能通過編譯。
不論那個版本,UIApplicationMain函數都是程式的關鍵點,下面是對這個函數的分析:
UIApplicationMain()函數是初始化程式的核心,它接受4個參數。其中argc和argv兩個參數來自於main()接受的兩個參數;另外兩個String型參數分別表示程式的主要類(principal
class)和代理類(delegate class)。如果主要類(principal class)為nil,則預設為UIApplication;如果代理類(delegate class)為nil,則程式假設程式的代理來自Main nib檔案。如果這兩個參數任意一個不為nil,則UIApplicationMain()函數則會根據參數建立相應的功能類。因此,如果程式中使用自訂的UIApplication類的子類(不建議繼承UIApplication類建立自訂的子類),你需要將你的自訂類名作為第3個參數傳進來。
根據上面的分析,我們來看以下iOS程式的聲明周期
對於UIApplicationMain函數中的第四個參數,我們也可以看出新舊版本的不同,我們建議在原先的工程中使用新的版本,以提高程式的速度,共修改如下幾處
假如你的工程類都是以TC開頭。
1.import你的appdelegate類,並修改第四個參數如下:
UIApplicationMain(argc, argv, nil,
NSStringFromClass([TCAppDelegate class]));
2.刪除MainWindow.xib檔案
3.在工程的Info.plist檔案中刪除下面一行
4.在TCAppDelegate.m檔案中,修改
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary
*)launchOptions函數,如下:
self.window = [[UIWindow
alloc] initWithFrame:[[UIScreen
mainScreen] bounds]];
// Override point for customization after application launch.
self.viewController = [[TCViewController
alloc] initWithNibName:@"TCViewController"
bundle:nil];
self.window.rootViewController =
self.viewController;
[self.window
makeKeyAndVisible];
return YES;
其中加粗部分為新增部分。
經過上面的修改,我們就可以在程式load的過程中,省去載入MainWindow.xib檔案,提高程式的速度。