IOS 程序启动过程

应用程序启动过程:

  1. 找到main.m 文件
  2. 执行main函数
  3. 执行UIApplicationMain()函数
  1. 实例化UIApplication对象 --> 继承自 UIApplication
  1. 设置UIApplication的代理 --> AppDelegate 如果需要自定义需要 遵守 UIApplicationDelegate

  2. 开启一个主循环 --> 监听用户的交互事件 --> 直到应用程序结束之后才会停止

  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 方法,内部会优先加载xib
    TestViewController *controller = [[TestViewController alloc] init];

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

  4. 让window成为主窗口并可见
    [self.window makeKeyAndVisible];
    return YES;
    }


创建控制器的多种方式

/**
第一种方式: 使用class 创建控制器

 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 方法,内部会优先加载xib
 TestViewController *controller = [[TestViewController alloc] init];
 */
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 关键步骤 一个程序从main函数开始启动。代码如下: int main(int argc, char * argv...
    JzRo阅读 606评论 0 2
  • 一、启动完整过程 1.main函数main.m 2.UIApplicationMain 创建UIApplicati...
    Z_Han阅读 611评论 0 5
  • *7月8日上午 N:Block :跟一个函数块差不多,会对里面所有的内容的引用计数+1,想要解决就用__block...
    炙冰阅读 2,554评论 1 14
  • 来到这座城已近一年, 感受这里的夏热与冬凉; 来到这座城已近一年, 触摸淅淅之秋雨与飞舞之春絮; 来到这座城已近一...
    softrain阅读 421评论 0 0
  • 这次工作坊为中阶课程,适合那些已经具备塔罗基础知识,并且想在解读能力和自我探索方面更上一层楼的同学。 这次课程会从...
    菲亚Faya阅读 1,326评论 0 2