UI进阶第一发:IOS程序完整启动过程及原理

IOS程序原理第二发:IOS程序完整启动过程及原理


一:ios程序启动原理

1.执行main函数

2.创建UIApplicationMain 

  1>创建UIApplication

  2>创建AppDelegate

  3>设置UIApplication的对象代理为AppDelegate

  4>delegate对象开始处理(监听)系统事件,开启主运行循环,保证程序一直处于运行状态不会关闭

  5>加载info.plist文件判断是否去加载Main.storyboard


主函数:

int main(int argc,char * argv[]) 

{

    @autoreleasepool

    {

        returnUIApplicationMain(argc, argv,nil, NSStringFromClass([AppDelegateclass]));

    }

}


底层实现图。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。


二:启动之后(此时分为两种情况)

 加载Main.storyboard执行:

  根据Info.plist获得最主要storyboard的文件名,加载最主要的storyboard

  * 创建UIWindow

  * 创建和设置UIWindowrootViewController

  * 显示窗口


不加载Main.storyboard(没有storyboard):

  * 程序启动完毕的时候, 就会调用代理的application:didFinishLaunchingWithOptions:方法

  * application:didFinishLaunchingWithOptions:中创建UIWindow

  * 创建和设置UIWindowrootViewController

  * 显示窗口




三:UIWindows的工作原理(没有storyboard的情况)

概念:

 1>UIWindow是一种特殊的UIView,通常在一个app中只会有一个UIWindow

 2>iOS程序启动完毕后,创建的第一个视图控件就是UIWindow,接着创建控制器的view,最后将控制器的view添加到UIWindows上,于是控制器的view就显示在屏幕上了。


1.创建storyboard版本控制器

 1>方法: 

 加载storyboard storyboardWithName:bundle:

 初始化对应的控制器:

  A.直接加载箭头指向的:

    instantiateInitialViewController

  B.先设置storyboard ID,然后根据ID标识进行加载:

    instantiateViewControllerWithIdentifier:

 ⚠注意:UIStoryboard 不能使用 alloc init 方法建立

 2>实现代码

    //加载storyboard

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main"bundle:nil];

    // 1 .加载箭头指向的控制器

    UIViewController *vc = [storyboardinstantiateInitialViewController];

    // 2 . 提前设置storyboardid ,然后根据id标识加载控制器

    UIViewController *vc = [storyboardinstantiateViewControllerWithIdentifier:];


2.创建xib版本控制器(创建一个xib(XibController.xib))

1>常见错误:

  A.Could not find a storyboard named 'Main' in bundle NSBundle …  

  解决:没有找到主程序Main,把Main Interface里面的Main删掉

  B. was unable to load a nib named "XibController"'

  解决:xib中没有描述控制器的view

  C. loaded the "XibController" nib but the view outlet was not set.

  解决:给xib绑定file’s owner 告诉xib描述哪个控制器 设置 file’s owner class为对应的控制器

  outletsview指向自定义的view


2>实现代码:

A. 使用initWithNibName方式加载

  XibController *vc = [[XibControlleralloc]initWithNibName:@"XibController"bundle:nil];

B.使用init方式加载

 ViewController *vc = [[ViewControlleralloc]init];

 在系统的 initWithNibName 方法里,判断nibNameOrNil是否为空

 - (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

 1>为空默认去加载与控制器前面名字相同的View.xib

 2>找不到就继续找与控制器名字相同的xib

 3>找不到就创建一个半透明的view

xib底层实现图。。。。。。。


附录:四大对象关系图


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值