程序启动开始到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.1程序执行首先执行main函数
*/
int main(int argc, char argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}

初始化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的代理方法浅析
 
 // 当应用程序启动完毕的时候就会调用(系统自动调用)
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//创建UIWindow,设置rootViewControlle等的操作都是在这里完成 // 1 . 创建UIwindow对象
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // 2 . 创建和设置UIWindow的rootViewController(根控制器)
CwlMainViewController *mainViewController = [CwlMainViewController alloc] init];
self.window.rootViewController = mainViewController; // 3 . 显示窗口
[self.window makeKeyAndVisable]; return YES;
}
// 即将失去活动状态的时候调用(失去焦点, 不可交互)
- (void)applicationWillResignActive:(UIApplication *)application
{
} // 重新获取焦点(能够和用户交互)
- (void)applicationDidBecomeActive:(UIApplication *)application
{ } // 应用程序进入后台的时候调用
- (void)applicationDidEnterBackground:(UIApplication *)application
{
// 一般在该方法中保存应用程序的数据, 以及状态
} // 应用程序即将进入前台的时候调用
- (void)applicationWillEnterForeground:(UIApplication *)application
{
// 一般在该方法中恢复应用程序的数据,以及状态
} // 应用程序即将被销毁的时候会调用该方法
- (void)applicationWillTerminate:(UIApplication *)application
{
// 注意:如果应用程序处于挂起状态的时候无法调用该方法
// 提醒是否关闭,保存重要信息等
} // 应用程序接收到内存警告的时候就会调用
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application
{
// 这里是监控全局的内存警告方法,所有内存警告首先会由这里接收到,再传递到各个控制器进行处理,一般在该方法中释放掉不需要的内存
}

控制器的多种创建方式

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文件,详细效果是这样。

【学习总结】IOS程序运行过程 、UIWindow 、controller 、 UIView 创建过程的总结的更多相关文章

  1. IOS程序运行过程

    IOS程序是从main开始运行的,main.m文件内容如下: #import <UIKit/UIKit.h> #import "AppDelegate.h" int m ...

  2. python学习笔记-python程序运行

    小白初学python,写下自己的一些想法.大神请忽略. 安装python编辑器,并配置环境(见http://www.cnblogs.com/lynn-li/p/5885001.html中 python ...

  3. QF——iOS程序运行原理(APP的生命周期)

    iOS程序的运行原理: main.m: 1. main.m 主函数是所有程序的入口函数. 2. 在main函数里是UIApplicationMain函数,开启了一个无限循环,以监听该应用. 该UIAp ...

  4. Java学习笔记——Java程序运行超时后退出或进行其他操作的实现

    当程序进入死循环或者由于其他原因无法自行终止的时候,就需要强制退出程序了. 对于开发软件 Eclipse ,在程序执行超时后,可以点击 Terminate 按钮强制退出. 那么,我们可不可以通过程序设 ...

  5. MVC5 Controller简要创建过程(1):ControllerFactory的创建

    即将离职,闲来无事回顾下MVC的源码,到了Controller创建这里,由于流程有点复杂,鉴于自己记性不太好,索性就记录一下吧,方便日后参照. 首先看MvcHandler: public class ...

  6. java中类的加载过程和对象的创建过程

    1.类加载过程 首先,jvm在执行时,遇到一个新的类,会先去内存的方法区中去寻找该类的.class文件,如果找到了就直接运行,如果没有找到,则会去硬盘中去寻找该类的.class文件,并将该类文件加载到 ...

  7. IOS 程序运行过程

    第一次写有点小紧张  希望大家多多指教! 主要讲讲程序从点击运行到结束这个过程中后面的代码都有哪些变化. 首先先了解一下UIApplication.UIApplication的核心作用是提供IOS运行 ...

  8. IOS基础开发一(ios程序运行过程)

    今天做了一个简单的仿QQ登陆UI晒一晒:

  9. UIViewController的生命周期及iOS程序运行顺序

    当一个视图控制器被创建,并在屏幕上显示的时候. 代码的运行顺序 1. alloc                                   创建对象,分配空间 2.init (initWit ...

随机推荐

  1. 给jdk写注释系列之jdk1.6容器(3)-Iterator设计模式

    前面讲了两种List,一种基于数组实现的ArrayList,一种基于链表实现的LinkedList,这两种list是我们工作中最常用到的List容器.当然数组和链表也是两种常见的基本数据结构,其他基本 ...

  2. LeetCode 11

    Container With Most Water Given n non-negative integers a1, a2, ..., an, where each represents a poi ...

  3. Sharepoint中出现webpart部署之后却找不到的一种情况

    今天遇到了一个很奇怪的问题,明明代码没有任何问题,部署之后却没有找到添加的webpart,在(web Parts)Galleries中也找不到,最后才发现可能是和服务器的运行速度有关,就像之前遇到的问 ...

  4. Table of Contents - JAXB

    Getting Started Hello World Hello World with Namespace xjc - 将 XML Schema 编译成 Java 类 wsimport: 编译 WS ...

  5. 第一回 认识Bootstrap

    Bootstrap 是Twitter推出的一个用于前端开发的开源工具包. Bootstrap是基于HTML5和CSS3开发的,它在jQuery的基础上进行了更为个性化和人性化的完善,形成一套自己独有的 ...

  6. ios swift reduce Method

    Swift’s API includes many functions and instance methods that reflect its functional programming her ...

  7. web服务器顺带网络负载均衡

    Web服务器配置共享文件 文件服务器需要做的 1. 建立共享文件夹,并建立两个子文件夹 2. 创建用户以便访问共享时使用此凭据 3. 共享并给予刚创建的用户读取和写入权限 Web服务器的设置 1. 新 ...

  8. jquery学习全面总结

    本文仅针对jquery的部分知识点做总结,更为全面的可以去官网看中文文档.可以更为详细的了解jquery及其特性. window.onload 和$(document).ready() 我 windo ...

  9. pl/sql developer 中文字段显示乱码

    在windows中创建一个名为“NLS_LANG”的系统环境变量,设置其值为“SIMPLIFIED CHINESE_CHINA.ZHS16GBK”,然后重新启动 pl/sql developer,这样 ...

  10. 深入探析koa之中间件流程控制篇

    koa被认为是第二代web后端开发框架,相比于前代express而言,其最大的特色无疑就是解决了回调金字塔的问题,让异步的写法更加的简洁.在使用koa的过程中,其实一直比较好奇koa内部的实现机理.最 ...