您的位置:首页 > 产品设计 > UI/UE

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

2015-01-21 00:18 465 查看
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
  * 创建和设置UIWindow的rootViewController
  * 显示窗口

不加载Main.storyboard(没有storyboard):
  * 程序启动完毕的时候,
就会调用代理的application:didFinishLaunchingWithOptions:方法
  * 在application:didFinishLaunchingWithOptions:中创建UIWindow
  * 创建和设置UIWindow的rootViewController
  * 显示窗口

三: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 . 提前设置storyboard的id
,然后根据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为对应的控制器
  outlets的view指向自定义的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底层实现图。。。。。。。



附录:四大对象关系图

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: