程序启动的完整过程

程序启动的完整过程

 int main(int argc, char * argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([MJAppDelegate class]));
    }
}

执行顺序

  • 1.main函数
  • 2.UIApplicationMain
    • 创建UIApplication对象
    • 创建UIApplication的delegate对象
  • 3.开启主运行循环
  • 3(1).delegate对象开始处理(监听)系统事件(没有storyboard)
    • 程序启动完毕的时候,就会调用代理的application:didFinishLaunchingWithOptions:方法
    • 在application:didFinishLaunchingWithOptions:中创建UIWindow
    • 创建和设置UIWindow的rootViewController
    • 显示窗口
  • 3<1>.根据Info.plist获得最主要storyboard的文件名,加载最主要的storyboard(有storyboard)
  • 创建UIWindow
  • 创建和设置UIWindow的rootViewController
  • 显示窗口

窗口(UIWindow)

  • 一种特殊的UIView,一个app中至少有一个UIWindow
  • iOS启动完毕后创建的第一个视图就是UIWindow
  • 接着创建控制器,再把控制器的View加到UIWindow上显示出来

- didFinishLaunchingWithOptions:方法中代码创建控制器

//创建窗口
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
//创建跟控制器
UIViewController *VC = [[UIViewController alloc] init];
//加到窗口的跟控制器中
self.window.rootViewController = VC;
//把控制器的View加到窗口中,,不加到跟控制器中也可以显示
//[self.window addSubview:rootVc.view];
//显示窗口
//[self.window makeKeyWindow];//设为主窗口
[self.window makeKeyAndVisible];//设为主窗口且显示
//self.window.hidden = NO;//只显示

窗口不能显示的原因

  • 没有强引用窗口
  • 没设置窗口的尺寸
  • 控制器没加到窗口中或者设为跟控制器

- didFinishLaunchingWithOptions:方法中代码加载storyboard的控制器

    // 1.创建窗口
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];

    // 2.加载storyboard文件,创建控制器

    // name:就是storyboard文件名
    // bundle:主bundle,传入nil,表示主bundle
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];

    // 通过标识创建控制器
//    UIViewController *rootVc = [storyboard instantiateViewControllerWithIdentifier:@"vc"];

    // instantiateInitialViewController:加载storyboard箭头指向的控制器
    UIViewController *rootVc = [storyboard instantiateInitialViewController];

    // 3.设置窗口的根控制器,并且显示窗口
    self.window.rootViewController = rootVc;

    // 4.显示窗口
    [self.window makeKeyAndVisible];

- didFinishLaunchingWithOptions:方法中代码加载xib的控制器

    // 1.创建窗口
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];

    // 2.设置窗口的根控制器
    // 通过xib去加载控制器
    // <1>.首先创建一个Xib文件
    // <2>.Xib文件需要拖一个View描述控制器的View
    // <3>.需要把Xib上的View与控制器连线,设置Xib的File‘owner为控制器
    UIViewController *rootVc = [[UIViewController alloc] initWithNibName:@"VC" bundle:nil];
    self.window.rootViewController = rootVc;

    // 3.显示窗口
    [self.window makeKeyAndVisible];

加载xib文件的顺序

  • 若加载xib文件传入name参数,则按参数描述的加载
  • 若未传入参数
    • 先加载与控制器名字的View.xib

      • 若控制器命名为YLViewController,则首先加载YLView.xib
    • 而后加载与控制名字一样的xib
      • 若控制器命名为YLViewController,则首先加载YLViewContrller.xib
    • 若都找不到则加载空。

创建控制器View的顺序

  • 优先layoutView代码创建
  • storyboard创建
  • xib创建

控制器View的生命周期

  • loadView
  • viewDidLoad(view加载完毕)
  • viewWillAppear(view即将显示到window)
  • viewDidAppear(view显示完毕,已经显示到窗口)
  • viewWillDisappear(view即将从window上移除,即将看不到)
  • viewDidDisappear(view从window上完全移除)

    当有内存警告时

  • didReceiveMemoryWarning(当收到内存警告)
  • viewWillUnload(view即将销毁的时候)

    销毁view,首先不在视野中得view

  • viewDidUnload(view销毁完毕)

处理应用程序的一些生命周期方法

// 程序启动完成的时候调用
// __func__:表示当前的方法在哪个类里面调用
// 程序加载完毕的时候调用
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    return YES;
}

// 当应用程序失去焦点的时候调用
- (void)applicationWillResignActive:(UIApplication *)application {
    // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
    // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
}

// 当应用程序进入后台的时候调用
// 保存一些数据
- (void)applicationDidEnterBackground:(UIApplication *)application {
    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}

// 当应用程序进入进台的时候调用
- (void)applicationWillEnterForeground:(UIApplication *)application {
    // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
}

// 当应用程序获取焦点的时候调用
// 当用户完全获取焦点的时候,才能跟界面交互
- (void)applicationDidBecomeActive:(UIApplication *)application {
    // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
}

// 当应用程序关闭的时候调用
- (void)applicationWillTerminate:(UIApplication *)application {
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}

// 当程序接收到内存警告的时候调用
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application
{
    // 可以在此处清空图片缓存
    NSLog(@"%s",__func__);
}
时间: 2024-10-24 08:43:47

程序启动的完整过程的相关文章

五、程序启动的完整过程

程序启动的完整过程: 1.先执行main函数,main内部会调用UIApplicationMain函数,该函数的声明如下: int UIApplicationMain(int argc, char argv[], NSString principalClassName, NSString *delegateClassName). argc.argv:标准main函数的参数,直接传递给UIApplicationMain进行相关处理即可 principalClassName:指定应用程序类,该类必须

41-50(UIApplication和delegate,UIApplicationMain,UIWindow,程序启动的完整过程,控制器view的延迟加载)

41.UIApplication和delegate 42.UIPickerView 43.UIDatePicker 44.程序启动的完整过程 45.UIApplicationMain 46.UIWindow 47.如何创建一个控制器 48.控制器view的延迟加载 49.多控制器 50.UINavigationController的使用步骤 { 这几天一直在赶项目, 今天终于闲下来了! 今天是个好日子,空间里满天的2014520 那么来看看我们程序员的爱情吧! 爱情就是死循环,一旦执行就陷进去了

UIPickerView/UIDatePicker/程序启动的完整过程

一.UIPickerView 1.UIPickerView的常见属性 数据源(用来告诉UIPickerView有多少列多少行) @property(nonatomic,assign) id<UIPickerViewDataSource> dataSource; 代理(用来告诉UIPickerView每1列的每1行显示什么内容,监听UIPickerView的选择) @property(nonatomic,assign) id<UIPickerViewDelegate>   deleg

UIPickerView,程序启动的完整过程

一.UIPickerView1.UIPickerView的常见属性// 数据源(用来告诉UIPickerView有多少列多少行)@property(nonatomic,assign) id<UIPickerViewDataSource> dataSource;// 代理(用来告诉UIPickerView每1列的每1行显示什么内容,监听UIPickerView的选择)@property(nonatomic,assign) id<UIPickerViewDelegate>   dele

Objective - C 学习笔记:程序启动的完整过程

1. main函数 2. UIApplicationMain * 创建UIApplication对象 * 创建UIApplication的delegate对象 3.1 delegate代理开始处理(监听)系统事件  (没有storyboard) * 程序启动完毕的时候, 就会调用代理的application:didFinishLaunchingWithOptions:方法 * 在application:didFinishLaunchingWithOptions:中创建UIWindow * 创建和

iOS程序启动的完整过程

1.main函数 2.UIApplicationMain* 创建UIApplication对象* 创建UIApplication的delegate对象 3.delegate对象开始处理(监听)系统事件(没有storyboard)* 程序启动完毕的时候, 就会调用代理的application:didFinishLaunchingWithOptions:方法* 在application:didFinishLaunchingWithOptions:中创建UIWindow* 创建和设置UIWindow的

程序启动和运行过程

摘抄自:http://www.cnblogs.com/kenshincui/p/3890880.html#runProcess 程序的运行过程 在几乎所有的程序开发中程序一般都是从main函数开始运行的,那么IOS程序也不例外,在上图中我们可以看到Xcode为我们生成了一个main.m文件: // // main.m // FirstIOS // // Created by Kenshin Cui on 14-2-23. // Copyright (c) 2014年 Kenshin Cui. A

IOS 应用程序启动加载过程(从点击图标到界面显示)

今天帮同事解决问题的时候发现,造成程序BUG的原因是同事对程序的启动和试图的加载过程不熟悉.所以当局部代码没有问题,但是程序一运行却总不是我们想要结果的时候,我们应该想想是不是因为我们忽略了试图加载过程的原因.下面我们用一个例子来简单介绍一下启动过程中常见的几个方法.首先我们通过XIB 创建了一个试图控制器(名字叫Empty ,不要问我为为啥它叫这个名字,因为我太懒了,鼠标点快了就没去该),又创建了一个UIView的子类(MyView),并且将Empty的对象 设置为窗口的跟控制器,MyView

005-iOS App程序启动过程

掌握 • 1.项目中常见文件(Info.plist和pch文件的作用) • 2.UIApplication • 3.AppDelegate的代理方法 • 4.iOS程序的完整启动过程(UIApplication.AppDelegate.UIWindow.UIViewController的关系) • 1.项目中常见文件(Info.plist和pch文件的作用) Info.plist 1>Info.plist常见的设置 •建立一个工程后,会在Supporting files文件夹下看到一个“工程名-