【学习总结】IOS程序运行过程 、UIWindow 、controller 、 UIView 创建过程的总结

程序启动开始到view显示:

程序启动首先会执行main函数 - > UIApplicationMain函数:

  1. 程序启动 (加载框架,info文件,资源等)
  2. 执行Main函数
  3. 初始化UIApplication单例对象
  4. 初始化AppDelegate对象,并设为UIApplication对象的代理
  5. 然后调用UIApplication的didFinishLaunchingWithOptions方法创建UIWindow对象,设置rootViewController根控制器等
  6. 然后建立一个主事件循环,其中包含UIApplication的Runloop来开始处理事件。

 

执行main函数

main函数作为程序的主入口,程序启动就自动执行main函数(main函数是一个死循环,保证了程序不会自动关闭)

1 /**
2 * 1.1程序执行首先执行main函数
3 */
4 int main(int argc, char  argv[]) {
5     @autoreleasepool {
6         return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
7     }
8 }

 

初始化UIApplication单例对象

初始化AppDelegate对象,并设为UIApplication对象的代理

创建UIApplication单例对象,并且设置UIApplication的Delegate对象(进入main函数后,首先就执行UIApplicationMain函数

所以启动程序就会创建application单例对象,并且设置了AppDelegate为application对象的代理

看看内部的定义:

//  argc、argv:直接传递给UIApplicationMain进行相关处理即可
//  principalClassName:指定应用程序类名(app的象征),该类必须是UIApplication(或子类)。如果为nil,则用UIApplication类作为默认值
//  delegateClassName:指定应用程序的代理类,该类必须遵守UIApplicationDelegate协议

int UIApplicationMain(int argc, char argv[], NSString principalClassName, NSString delegateClassName);

 

 

调用UIApplication的didFinishLaunchingWithOptions方法创建UIWindow单例对象

程序启动完成后 , 接着会建立应用程序的Main Runloop(事件循环),进行事件的处理(首先会在程序完毕后调用delegate对象的application:didFinishLaunchingWithOptions:方法)
 
Runloop的理解,可参考文章 : 转载自【楚天舒iOS程序与运行Runloop】
 
application的代理方法浅析
 
 1 // 当应用程序启动完毕的时候就会调用(系统自动调用)  
 2   - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions  
 3   {  
 4       //创建UIWindow,设置rootViewControlle等的操作都是在这里完成
 5 
 6      // 1 . 创建UIwindow对象
 7       self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
 8 
 9      // 2 . 创建和设置UIWindow的rootViewController(根控制器)
10       CwlMainViewController *mainViewController = [CwlMainViewController alloc] init];
11       self.window.rootViewController = mainViewController;
12 
13      // 3 . 显示窗口
14      [self.window makeKeyAndVisable]; 
15      
16       return YES;  
17   }  
18   // 即将失去活动状态的时候调用(失去焦点, 不可交互)  
19   - (void)applicationWillResignActive:(UIApplication *)application  
20  {  
21  }  
22    
23  // 重新获取焦点(能够和用户交互)  
24  - (void)applicationDidBecomeActive:(UIApplication *)application  
25  {  
26    
27  }  
28    
29  // 应用程序进入后台的时候调用  
30  - (void)applicationDidEnterBackground:(UIApplication *)application  
31  {  
32       // 一般在该方法中保存应用程序的数据, 以及状态  
33  }  
34    
35  // 应用程序即将进入前台的时候调用    
36  - (void)applicationWillEnterForeground:(UIApplication *)application  
37  {  
38      // 一般在该方法中恢复应用程序的数据,以及状态
39  }  
40    
41  // 应用程序即将被销毁的时候会调用该方法   
42  - (void)applicationWillTerminate:(UIApplication *)application  
43  {  
44       // 注意:如果应用程序处于挂起状态的时候无法调用该方法
45       // 提醒是否关闭,保存重要信息等
46  }  
47    
48  // 应用程序接收到内存警告的时候就会调用  
49  - (void)applicationDidReceiveMemoryWarning:(UIApplication *)application  
50  {  
51       // 这里是监控全局的内存警告方法,所有内存警告首先会由这里接收到,再传递到各个控制器进行处理,一般在该方法中释放掉不需要的内存  
52  }   

 

 

控制器的多种创建方式 

1. 通过storyboard直接创建

2. 直接创建

CwlViewController *cwl = [[CwlViewController alloc] init];

 

3. 通过xib文件创建

CwlViewController *cwl = [[CwlViewController alloc] initWithNibName:@"CwlViewController" bundle:nil]];

 

 

控制器的View的多种创建方式

创建完控制器之后,会创建控制器的view,view的创建有多种情况,看下图:

需要注意的地方

1. 控制器的loadView方法优先级是最高的

2. 因为在官方文档的图片中,已经忽略xib的情况,如果storyboard没被设置,就先判断xib文件,详细效果是这样。

 

 

posted @ 2015-08-25 18:48  Travin-C  阅读(329)  评论(0编辑  收藏  举报