一: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底层实现图。。。。。。。。。。。。。。。。。。。
附录:四大对象关系图