IOS程式是從main開始運作的,main.m檔案内容如下:
#import <UIKit/UIKit.h>
- #import "AppDelegate.h"
- int main(int argc, char *argv[])
- {
- @autoreleasepool {
- return UIApplicationMain(argc, argv, nil,
- NSStringFromClass([AppDelegate class]));
- }
- }
在main函數中我們其實隻能看到一個方法,這個方法内部是一個消息循環(相當于一個死循環),是以運作到這個方法UIApplicationMain之後程式不會自動退出,而隻有當使用者手動關閉程式這個循環才結束。
這個方法有四個參數:
- 第一個參數和第二個參數其實就是main函數的參數,分别代表:參數個數、參數内容;
- 第三個參數代表UIApplication類(或子類)字元串,這個參數預設為nil則代表預設為UIApplication類,使用者可以自定義一個類繼承于這個類;如果為nil則等價于NSStringFromClass([UIApplication class]),大家可以自己試驗,效果完全一樣;UIApplication是單例模式,一個應用程式隻有一個UIApplication對象或子對象;
- 第四個參數是UIApplication的代理類字元串,預設生成的是AppDelegate類,這個類主要用于監聽整個應用程式生命周期的各個事件(其實類似于之前我們文章中提到的事件監聽代理),當UIApplication運作過程中引發了某個事件之後會調用代理中對應的方法。該類繼承自UIResponder,這是使用storybaord的要求,而以前使用使用nib時,應用委托類是直接繼承自NSObject的。而且必須有一個不是UIOutlet類的Window屬性聲明才可以;
當執行UIApplicationMain方法後這個方法會根據第三個參數建立對應的UIApplication對象,這個對象會根據第四個參數AppDelegate建立并指定此對象為UIApplication的代理;同時UIApplication會開啟一個消息循環不斷監聽應用程式的各個活動,當應用程式生命周期發生改變UIApplication就會調用代理對應的方法。
注:在nib管理的應用程式中,最後一個參數是nil;而在storyboard管理的應用程式中,最後一個參數是AppDelegate的類名稱。因為nib檔案包含了appDelegate的名稱,而storyboard中沒有,是以必須在UIApplicationMain()中指定appDelegate的名稱。
建立在storyboard上的應用程式,在它啟動時,使用 鍵UIMainStoryboardFile去指定必須被加載的storyboard的名字。當這個設定提供後,UIApplication将加載MainStoryboard.storyboard檔案,同時自動執行個體化來自storyboard的第一個視圖控制器,将該視圖控制器的視圖們放入一個新的UIWindow對象中。這個過程不需編碼。
在一個iOS應用中必須有一個主視窗UIWindow。在UIWindow中必須有一個根控制器,這個控制器距離UIWindow是最近的;設定一個控制器為根控制器和直接通過addSubView添加控制器的視圖(view屬性)到window并不完全一樣(例如如果僅僅添加控制器視圖那麼應用雖然可以顯示但是不支援旋轉);UIViewController是視圖控制器,主要用來控制UIView,在UIViewController内部有一個UIView(view屬性);
http://www.cnblogs.com/damao2012/p/3349239.html
http://cddxhy.blog.163.com/blog/static/339992832012102353224495/
http://www.th7.cn/Program/IOS/201408/256101.shtml
http://mikixiyou.iteye.com/blog/1491672