C語言的入口函數(shù)是main(),Objective-C也一樣。
在項(xiàng)目導(dǎo)航面板中選中main.m,可以看到
int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
UIApplicationMain函數(shù)會創(chuàng)建一個(gè)UIApplication對象。每個(gè)iOS應(yīng)用都有且只有一個(gè)UIApplication對象(單例),該對象的作用時(shí)維護(hù)運(yùn)行循環(huán)。一旦程序創(chuàng)建了某個(gè)UIApplication對象,該對象的運(yùn)行循環(huán)就會一直循環(huán)下去,main()的執(zhí)行也會因此阻塞。
此外,UIApplicationMain函數(shù)還會創(chuàng)建某個(gè)指定類(此處為AppDelegate)的對象,并將其設(shè)置為UIApplication對象的delegate。UIApplicationMain函數(shù)的第三個(gè)實(shí)參為NSString類型,指定了該對象所屬的類。UIApplication的delegate都需要遵守UIApplicationDelegate協(xié)議。
@interface AppDelegate : UIResponder <UIApplicationDelegate>
在應(yīng)用啟動運(yùn)行循環(huán)時(shí),UIApplication對象會在應(yīng)用出現(xiàn)相應(yīng)狀態(tài)變化時(shí),向其delegate發(fā)送特定的消息。如:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
- (void)applicationWillResignActive:(UIApplication *)application;
- (void)applicationDidEnterBackground:(UIApplication *)application;
- (void)applicationWillEnterForeground:(UIApplication *)application;
- (void)applicationDidBecomeActive:(UIApplication *)application;
- (void)applicationWillTerminate:(UIApplication *)application;
UIApplication負(fù)責(zé)建立應(yīng)用程序的事件循環(huán)(Event Loop),事件循環(huán)中可以不斷接收交互操作,比如屏幕觸摸手勢、各類傳感器(重力加速器、陀螺儀等)等。