Xcode生命周期简介

本文介绍了Xcode中程序文件的区别,强调了Xcode7的启动界面设置,并详细讲解了info.plist、PCH文件的作用。接着,文章深入探讨了UIApplication的单例,包括设置提醒数字、联网状态和状态栏的方法。此外,还详细阐述了UIApplicationDelegate的重要性以及应用程序的启动流程。UIWindow作为iOS显示的基础,其创建、设置根控制器和显示过程也被逐一解析,包括从StoryBoard和Xib加载控制器的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.Xcode程序文件的区别

  • Xcode5有frameworks文件夹,用于存放导入的框架(需要手动导入);而Xcode6没有frameworks文件夹,看不到导入的框架,用LaunchScreen.xib来设置启动界⾯面;Xcode7也看不到导入的框架,用LaunchScreen.storyBoard设置启动界面.
  • Xcode7如果没有设置启动图片,模拟器默认的尺寸⼤小是4s的尺寸⼤小.(可以打印屏幕尺⼨寸验证.).
  • 它的底层实现其实把LaunchScreen上的东西,生成了一张图片,然后把这张图片设为程序的启动图片. 可以进入沙盒当中查看, 查看方法,找到应⽤用程序根目录. 获取⽅法: NSLog(@"%@",NSHomeDirectory()); 打印出来,后前往⽂件夹.找到Library->Caches->Snapshots目录下⾯面.最后一层就是程序自动生成的图片.

2.项目中常见的文件(info.plist)

  • Supporting file⼀般都是放些资源⽂文件,像一些plist这些等.
  • xcode5当中也有info.plist,只不过它的名字很长.是工程的名称.在xcode5当中,会⾃动生成⼀个pch文件,在Xcode6当中不会帮我们生成PCH文件.
  • Bundle Name:应用程序的名称.
  • Bundle versionstring,short:应⽤程序的版本.在开发当中都是迭代开发.苹果要求下⼀次提交的版本必须得要比上⼀次提交的版本要⾼.
  • Bundle Version:应用程序编译的版本.
  • Bundle identifier:应用程序标识符.保证应用程序的唯一性,
  • 如果两个应⽤同⼀个标识符,那么之前的那个应用会被干掉.

3.PCH文件

  • 作用:PCH的作⽤用:存放一些公用的宏以及存放一些公用的文件.
  • 只要在pch当中定义的东西, 会被整个应用程序共享.
  • PCH它是一个预编译文件,要告诉系统要提前编译它.要去做一些配置. 在Buld Setting 当中找perfix 找到Precomplie prefix Header 设为yes.如下图所示:

  • 设完这些后,再进行prefix Header的路径配置.路径从根层开始.如下图所示:

4.UIApplication单例

  • 一个iOS程序启动后创建的第一个对象就是UIApplication对象我们只能通过[UIApplicationsharedApplication]获得这个单例对象,不能够⼿动去创建它.
  • UIApplication的作用:(1)利⽤用UIApplication对象,能进行一些应用级别的操作.(2)可以设置应⽤用程序图标右上角的红色提醒数字(3)设置联网指示器的可见性(4)可以设置应用程序的状态栏 (5)进⾏行应用之间的跳转.
4.1设置应⽤用提醒数字
  • 获取UIApplication对象 UIApplication *ap = [UIApplication sharedApplication];
  • 在设置之前, 要注册⼀个通知: UIUserNotificationSettings *notice = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil];
  • 注册通知对象 [ap registerUserNotificationSettings:notice];
  • 设置提醒数字 ap.applicationIconBadgeNumber = 10;
4.2设置联网状态

ap.networkActivityIndicatorVisible = YES;

4.4设置状态栏
  • -(UIStatusBarStyle)preferredStatusBarStyle{ return UIStatusBarStyleLightContent; }
  • 隐藏状态栏,通过控制器的⽅式.同样实现方法 返回NO时为不隐藏:-(BOOL)prefersStatusBarHidden{ return NO; }
  • 返回YES时为隐藏 -(BOOL)prefersStatusBarHidden{ return YES; }

5.UIApplication代理

  • 所有的移动操作系统都有个致命的缺点:app很容易受到打扰。 ⽐如一个来电或者锁屏会导致app进入后台甚至被终止 还有很多其它类似的情况会导致app受到干扰,在app受到干扰时,会产⽣一些系统事件, 这时UIApplication会通知它的delegate对象,让delegate代理来处理这些系统事件
  • UIApplication会在程序⼀启动时候创建一个遵守UIApplicationDelegate代理.这个就是我们程序 在这个类中很定义很多监听系统事件的⽅法.同时也定义了⼀些应⽤用程序的⽣命周期方法.主要方法如下
(1)应用程序启动完成的时候调用
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions: (NSDictionary *)launchOptions

(2)当我们应用程序即将失去焦点的时候调⽤
- (void)applicationWillResignActive:(UIApplication *)application { NSLog(@"%s",__func__);
}

(3)当我们应用程序完全进入后台的时候调⽤
- (void)applicationDidEnterBackground:(UIApplication *)application{ NSLog(@"%s",__func__);
}

(4) 当我们应⽤用程序即将进⼊入前台的时候调用
- (void)applicationWillEnterForeground:(UIApplication *)application { NSLog(@"%s",__func__);}

(5)当我们应⽤程序完全获取焦点的时候调用
只有当一个应用程序完全获取到焦点,才能与用户交互.
- (void)applicationDidBecomeActive:(UIApplication *)application { NSLog(@"%s",__func__);
}

(6)当我们应用程序即将关闭的时候调⽤用
- (void)applicationWillTerminate:(UIApplication *)application { NSLog(@"%s",__func__);
}

6.应用程序的程动流程

  • 1.执⾏行Main
  • 2.执行UIApplicationMain函数.
  • 3.创建UIApplication对象,并设置UIApplicationMain对象的代理. UIApplication的第三个参数就是UIApplication的名称,如果指定为nil,它会默认 为UIApplication. UIApplication的第四个参数为UIApplication的代理.
  • 4.开启⼀一个主运⾏行循环.保证应用程序不退出.
  • 5.加载info.plist.加载配置文件.判断一下info.plist文件当中Main storyboard file base name ⾥面有没有指定storyboard⽂件,如果有就去加载info.plist文件,如果没有,那么应用程序加载完毕.

7.UIWindow

  • UIWindow是⼀种特殊的UIView,通常在一个app中⾄少有⼀个UIWindow,一个iOS程序之所以能显⽰示到屏幕上,完全是因为它有UIWindow
  • 在加载info.plist,判断下是否指定main,如果指定了,就会去加载StoryBoard. 流程如下(1).创建一个窗口 (2).加载MainStoryBoard,初始化一个控制器. (3).把初始化出来的控制器设置为窗口的根控制器.让窗口显示到屏幕上.
7.1在开发当中,通常都是手动去创建窗口.
  • (1).创建窗口,要有窗口显示,必须要有强引用.窗口也是控件,要想展示出来.必须得要有尺寸,代码为:self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
  • (2).创建控制器 会把控制器的View添加到窗⼝上.并且有一个旋转的功能. UIViewController *vc = [[UIViewController alloc] init]; vc.view.backgroundColor = [UIColor redColor];
  • (3).设置控制器为窗口的根控制器 self.window.rootViewController = vc;
  • (4).显示窗口 [self.window makeKeyAndVisible];
(4.1)[self.window makeKeyAndVisible]的底层实现
  • 1.窗口默认是隐藏的.hidden = yes. 底层做的事件就是: self.window.hidden = NO;
  • 2把控制器的View添加到窗⼝上面. [self.window addSubView:rootVC.view];
  • 3.把当前窗口设置成应⽤程序的主窗口 application.keyWindow获得应用程序的主窗口.

8.从StoryBoard加载控制器

  • 1.创建窗⼝ self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
  • 2.加载控制器 从StoryBoard当中加载控制器 UIStoryboardstoryBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; 加载箭头指向的控制器 UIViewController vc = [storyBoard instantiateInitialViewController];
  • 3.设置窗口根控制器 self.window.rootViewController = vc;
  • 4.显示窗口 [self.window makeKeyAndVisible];

9.通过Xib加载控制器的View

  • 1.创建窗口 self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; -2.从XIB当中加载控制器. MyViewController *vc = [[MyViewController alloc] initWithNibName:@"VC" bundle:nil]; -3设置窗⼝根控制器: self.window.rootViewController = vc; -4.显⽰示窗口 [self.window makeKeyAndVisible];操作如图:

1.创建窗口
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; 2.设置窗口的根控制器.
2.1从Xib当中加载控制器.
initWithNibName:如果指定了名称,那么它就会去加载指定名称的Xib.
MyViewController *vc = [[MyViewController alloc] initWithNibName:@"VC" bundle:nil];
如果没有指定名称.指定为nil,那么它就会去先加载跟它相同名称的Xib. 如果没有跟它相同名称的Xib,那么它就会再去加载跟它相同名称去点Controller的名字的Xib. MyViewController *vc = [[MyViewController alloc] initWithNibName:nil bundle:nil];
控制器的init⽅方法会调⽤用initWithNibName:⽅方法. MyViewController*vc= [[MyViewControlleralloc]init]; self.window.rootViewController = vc;
3.显⽰示窗⼝口
[self.window makeKeyAndVisible];
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值