IOS 程序啟動過程

應用程序啟動過程:

  1. 找到main.m 文件
  2. 執(zhí)行main函數
  3. 執(zhí)行UIApplicationMain()函數
  1. 實例化UIApplication對象 --> 繼承自 UIApplication
  1. 設置UIApplication的代理 --> AppDelegate 如果需要自定義需要 遵守 UIApplicationDelegate

  2. 開啟一個主循環(huán) --> 監(jiān)聽用戶的交互事件 --> 直到應用程序結束之后才會停止

  3. 檢測是否存在sb

  • 如果存在

    1. 實例化一個UIWindow對象
    2. 實例化箭頭所指的控制器器
    3. 實例化控制器的view和子view
    4. 設置控制器成為window的根控制器
    5. 讓window 可見

    調用AppDelegate的方法
    didFinishLaunchWithOpitons: 完成啟動

  • 如果不存在sb
    直接調用AppDelegate的方法
    didFinishLaunchWithOpitons: 完成啟動
    didFinishLaunchWithOpitons:

    1. 實例化UIWindow, 賦值 給 self.window
    2. 實例化一個ViewController
    3. 設置self.window.roothViewController =

代碼示例

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

  1. 實例化一個window
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    self.window.backgroundColor = [UIColor whiteColor];

  2. 實例化控制器

    // 如果存在和類名相同的xib , 通過 alloc init 方法,內部會優(yōu)先加載xib
    TestViewController *controller = [[TestViewController alloc] init];

  3. 設置window的根控制器
    self.window.rootViewController = controller;

  4. 讓window成為主窗口并可見
    [self.window makeKeyAndVisible];
    return YES;
    }


創(chuàng)建控制器的多種方式

/**
第一種方式: 使用class 創(chuàng)建控制器

 ViewController *controller = [[ViewController alloc] init];
 */

/**
 第二種方式:  使用storyboard
 
 // 實例化 storyboard對象
 UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
 
 // 取出storyboard中的 控制器 , 使用這種方式實例化控制器的時候, 箭頭必須在,如果不存在, 就會加載不到控制器
 UIViewController *controller = [storyboard instantiateInitialViewController];
 
 */

/**
 第三種: 通過 storyboard 的 storyboard ID
 
 UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
 
 UIViewController *controller = [storyboard instantiateViewControllerWithIdentifier:@"bigfang"];
 */

/**
 第四種: 加載xib
 
 UIViewController *controller = [[NSBundle mainBundle] loadNibNamed:@"LoadXib" owner:nil options:nil].lastObject;
 */

/**
 第五種: 實例化xib
 
 在xib中沒有view存在
 
 reason: '-[UIViewController _loadViewFromNibNamed:bundle:] was unable to load a nib named "IntinalTest"'
 
 view沒有進行關聯
 
 reason: '-[UIViewController _loadViewFromNibNamed:bundle:] loaded the "IntinalTest" nib but the view outlet was not set.'
 
 
 UIViewController *controller = [[UIViewController alloc] initWithNibName:@"IntinalTest" bundle:nil];
 
 */

/**
 第六種: 和同類名xib
 
 
 // 如果存在和類名相同的xib , 通過 alloc init 方法,內部會優(yōu)先加載xib
 TestViewController *controller = [[TestViewController alloc] init];
 */
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 關鍵步驟 一個程序從main函數開始啟動。代碼如下: int main(int argc, char * argv...
    JzRo閱讀 662評論 0 2
  • 一、啟動完整過程 1.main函數main.m 2.UIApplicationMain 創(chuàng)建UIApplicati...
    Z_Han閱讀 646評論 0 5
  • *7月8日上午 N:Block :跟一個函數塊差不多,會對里面所有的內容的引用計數+1,想要解決就用__block...
    炙冰閱讀 2,728評論 1 14
  • 來到這座城已近一年, 感受這里的夏熱與冬涼; 來到這座城已近一年, 觸摸淅淅之秋雨與飛舞之春絮; 來到這座城已近一...
    softrain閱讀 464評論 0 0
  • 這次工作坊為中階課程,適合那些已經具備塔羅基礎知識,并且想在解讀能力和自我探索方面更上一層樓的同學。 這次課程會從...
    菲亞Faya閱讀 1,450評論 0 2

友情鏈接更多精彩內容