iOS中一个APP的启动过程

我们在iOS开发中,往往是习惯性地去创建一个模板进行代码的书写,例如我们很熟悉的Single View Application模板,在这些模板创建好了之后通常会有大家很熟悉的几个文件已经被创建好,例如AppDelegate、main函数。info.plist等这些文件。相信很多开发者对于怎么去使用这些文件十分熟悉,于此同时,这些文件在一个iOS中的APP启动中有很大重要的,本文就从很容易被开发者忽略的main函数(因为这个函数不需要大家去进行修改)来讲述一个APP的启动过程

关于main函数(这里用xcode4.2之后的版本进行说明)
#import <UIKit/UIKit.h>
#import "AppDelegate.h"

int main(int argc, char * argv[]) {
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}
autoreleasepool这是ARC中所谓的自动释放池机制,自动释放池里面返回了一个函数(准确的说是这个函数的返回值),我们应该很好奇这是个什么函数,于是按住command键,点击UIApplicationMain跳转
// If nil is specified for principalClassName, the value for NSPrincipalClass from the Info.plist is used. If there is no
// NSPrincipalClass key specified, the UIApplication class is used. The delegate class will be instantiated using init.
UIKIT_EXTERN int UIApplicationMain(int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName);
将函数原型给摘录了出来,也有一段英文的简要描述,这里就对这个方法进行个详细的说明:通过观察,我们可以发现这个方法带有4个参数:
1、前两个参数呢,是ISO C标准的main函数的参数(可能会发现不理解这个名字,其实这只是一种规定,这点类似于我们所熟悉的java中关于主函数的代码为 public static void main(String[] args) 其实在这里,这个args就是arguments的缩写,有经验的开发者都知道,这个名字可以改动的,只是大家这么写都约定成俗了 )
2、接下来的两个参数我们会发现第一个是nil,第二个是一个对象的class的名字,对于这两个参数,可能就是在iOS开发中比较重要的了,第一个参数表示这个应用程序对应的类(满足是UIApplication类的子类的前提),第二个表示刚刚的应用程序对应的类的代理类(必须遵守UIApplicationDelegate协议)(通常来说也就是我们所熟悉的AppDelegate类)。通俗来讲,每个app启动的时候都会创建一个应用程序对应的类的对象(我们姑且可以将它认作为我们的app),但是这个对象却不做事件的响应,而是交给了AppDelegate这个代理类的对象来做,到这里很多人就很熟悉了,所谓的应用程序的生命周期就是在AppDelegate中那几个方法所对应呈现的。应用程序对象设置应用程序代理对象为代理,在应用程序代理类中进行事件的响应。到这里,逻辑就大致理清了。接着我们可以发现,第三个参数系统是设置为默认的nil的,当设置为nil时,系统会用UIApplication类(实际上是类名)来作为这里的参数。一般来说我们是没有必要去创建一个UIApplication的子类,然后在这里填写子类的名字,所以都是使用nil。最后,UIApplicationMain这个函数就会联系应用程序类和应用程序代理类,设置代理关系。

说明完4个参数,理解到创建应用对象时的事件后,接着需要去了解视图是怎么加载上去的。
对于使用纯代码的开发者来说,是需要在AppDelegate.m文件中的application:didFinishLaunchingWithOptions:这个应用程序生命周期方法中创建UIWindow,然后在进行一些列操作,这才使得视图被我们所见。同时,我们发现,就拿Single View Application这个模板来说,我们发现在application:didFinishLaunchingWithOptions:这个方法或者是说在AppDelegate类中都没有发现有手动创建视图的操作,这是为什么呢?其实,伴随着storyboard的出现,苹果在info.plist文件中加入了一项加载初始视图的配置:


这个配置就让Main.storyboard作为第一加载项,不需要任何的代码操作(换句话说,在配置中已经做好了),这样的话,我们就能够在Main.storyboard或者是它所对应的类进行项目的编辑工作了。

说道这里,视图的加载过程也已经清晰,对于iOS中的生命周期有两种:
1、一种是应用程序的生命周期,在上面已经提到过,利用在AppDelegate这个应用程序对象的代理类中使用几个方法进行操作
2、另一种是视图控制器的生命周期,说道这大家也就是很熟悉了,viewDidLoad、viewWillAppear等等,我们通过这些方法来对一个视图控制器的生命周期进行管理和操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值