如同任何基于C的应用程序,程序启动的主入口点为iOS应用程序的main函数。在iOS应用程序,main函数的作用是很少的。它的主要工作是控制UIKit framework。因此,你在Xcode中创建任何新的项目都配备了一个默认的主函数。除了少数特例外,你永远不应该改变这个函数的实现。

#import <UIKit/UIKit.h>
#import "AppDelegate.h" int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}

  UIApplicationMain函数有四个参数,并使用这些参数来初始化应用程序。你不应该改变传递给这个函数的默认值。尽管如此,了解他们的目的,以及他们是如何启动的应用程序,它也是有价值的。

函数原型:

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

参数解释:

argc和argv:是ISO C标准的main函数的参数,直接传递给UIApplicationMain进行相关处理。参数包含应用程序何时从系统启动等信息。这些参数是由UIKit的基础设施解析,否则可以忽略不计。

principalClassName:这个参数标识了应用程序的类的名称(该类必须继承自UIApplication类)。这是负责运行应用程序的类。建议为这个参数传nil。

delegateClassName:是应用程序类的代理类。应用程序的代理负责管理系统和你的代码之间的高层次的互动。 Xcode的项目模板会自动将该参数设置为一个适当的值。

  UIApplicationMain函数做的另一件事是加载应用程序的主用户界面文件。主界面文件包含应用程序的用户界面中显示的初始视图相关的对象。对于使用storyboard的应用程序,这个函数会从你的storyboard的初始视图控制器和您的应用程序代理提供的窗口运行。对于使用nib文件的应用程序,该方法将nib文件内容加载内存中,但不会在你的应用程序的窗口进行运行;您必须在应用程序委托的方法中运行如下方法。

- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(nullable NSDictionary *)launchOptions NS_AVAILABLE_IOS(6_0);

  一个应用程序可以有一个主storyboard文件或者一个主nib文件,但它不能兼得。storyboards是首选的方式来指定你的应用程序的用户界面,但不支持在所有版本的iOS。应用程序主storyboard的文件名应该在应用程序的Info.plist文件中的UIMainStoryboardFile键值中设定。(对于以nib文件为基础的应用程序,你的主nib文件的名称需要在NSMainNibFile键值中设定。)通常情况下,Xcode会在你创建项目时创建相应键的值,但可以根据需要进行更改。

  如果主要nib文件存在,就会在nib文件对象里寻找Application对象和连接它的delegate。此函数会根据principalClassName创建UIApplication对象,然后根据delegateClassName创建一个delegate对象,并将UIApplication对象中的delegate属性设置为delegate对象。

在程序启动时:

当您的应用程序启动(无论是进入前台还是后台),需要使用如下方法并进行相应操作:

- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(nullable NSDictionary *)launchOptions NS_AVAILABLE_IOS(6_0);
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(nullable NSDictionary *)launchOptions NS_AVAILABLE_IOS(3_0);

①检查启动选项字典中的内容,查看程序启动的方式,并做出适当的反应。

②初始化应用程序的关键数据结构。

③准备好你的应用程序的窗口和视图进行显示。

使用OpenGL ES的应用程序不应该使用这个方法来准备他们的绘图环境。相反,他们应该推迟到

- (void)applicationDidBecomeActive:(UIApplication *)application;

方法调用时启动OpenGL ES绘图方法。

如果您的应用程序不会自动在启动时加载一个主要storyboard或nib文件,您可以使用

- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions;

编写你的应用程序的窗口显示。对于同时支持纵向和横向的应用程序,始终设置主窗口的根视图控制器在纵向方向。如果该设备是在一个不同的方向在启动时,系统会告诉根视图控制器显示窗口的旋转信息,以保持正确的方向。

您的应用程序

- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;

方法应该总是​​尽可能为轻量,以减少你的应用程序的启动时间。应用预期将启动并初始化自身,并开始处理不到5秒的事件。如果一个应用程序没有及时完成它的启动周期,系统会杀死它。因此,有可能你的启动慢下来(如接入网络)的任何任务,应在异步辅助线程执行。

当程序启动到前台,该系统还会调用

- (void)applicationDidBecomeActive:(UIApplication *)application;

方法来完成过渡到前台。因为这种方法既在启动时与从后台过渡到前台时被调用,使用它来执行所共有的两个转变的任何任务。

当程序在后台运行时,除了准备好对任何事件到达的处理,不应该有太多的任务让应用程序做。

[iOS]被忽略的main函数的更多相关文章

  1. main函数的简介

    ////  main函数的简介.h//  IOS笔记////  Created by .//  Copyright © 2015年  All rights reserved.// //#import ...

  2. 转:iOS程序main函数之前发生了什么

    原文地址:http://blog.sunnyxx.com/2014/08/30/objc-pre-main/ 我是前言 一个iOS app的main()函数位于main.m中,这是我们熟知的程序入口. ...

  3. iOS程序main函数之前发生了什么

    我是前言 一个iOS app的main()函数位于main.m中,这是我们熟知的程序入口.但对objc了解更多之后发现,程序在进入我们的main函数前已经执行了很多代码,比如熟知的+ load方法等. ...

  4. 06_传智播客iOS视频教程_源文件后缀名和main函数

    OC与C语言的不同. 把OC程序运行起来,CPU只会找main函数.并且只会执行main函数当中的代码.当main函数的代码执行完毕之后这个程序就自动结束掉了. main函数的参数是可以让我们在运行程 ...

  5. IOS学习笔记06---C语言函数

    IOS学习笔记06---C语言函数 --------------------------------------------  qq交流群:创梦技术交流群:251572072              ...

  6. 【Go入门教程3】流程(if、goto、for、switch)和函数(多个返回值、变参、传值与传指针、defer、函数作为值/类型、Panic和Recover、main函数和init函数、import)

    这小节我们要介绍Go里面的流程控制以及函数操作. 流程控制 流程控制在编程语言中是最伟大的发明了,因为有了它,你可以通过很简单的流程描述来表达很复杂的逻辑.Go中流程控制分三大类:条件判断,循环控制和 ...

  7. main函数(本文较老,仅作参考)

    Xcode4.2之前的main函数如下: int main(int argc, char *argv[]) { NSAutoreleasePool *pool = [[NSAutoreleasePoo ...

  8. IOS学习笔记07---C语言函数-printf函数

    IOS学习笔记07---C语言函数-printf函数 0 7.C语言5-printf函数 ------------------------- ----------------------------- ...

  9. 菜鸟nginx源码剖析 框架篇(一) 从main函数看nginx启动流程(转)

    俗话说的好,牵牛要牵牛鼻子 驾车顶牛,处理复杂的东西,只要抓住重点,才能理清脉络,不至于深陷其中,不能自拔.对复杂的nginx而言,main函数就是“牛之鼻”,只要能理清main函数,就一定能理解其中 ...

随机推荐

  1. Java设计模式—状态模式

    状态模式又是一个比较难的设计模式 定义如下: 当一个对象内在状态改变时允许其改变行为,这个对象看起来像改变了其类. 个人理解:通俗的讲,状态模式就是状态的改变引起了行为的改变,但是,我们只能看到行为的 ...

  2. python oop常用术语 继承 多态 封装

    面向对象优点 1.通过封装明确了内外 2.通过继承+多态在语言层面支持了归一化设计 抽象/实现 抽象指对现实世界问题和实体的本质表现,行为和特征建模,建立一个相关的子集,可以用于 绘程序结构,从而实现 ...

  3. ISO14971-2007阅读

    1.什么是风险? 风险的概念,公认的组成有两部分: 损害发生的概率 损害的后果,即损坏的严重性 2.风险管理的适用范围? 适用于医疗器械生命周期所有阶段 不适用于临床判断 不要求具体的质量体系,但14 ...

  4. 使用 Azure PowerShell 将 IaaS 资源从经典部署模型迁移到 Azure Resource Manager

    以下步骤演示了如何使用 Azure PowerShell 命令将基础结构即服务 (IaaS) 资源从经典部署模型迁移到 Azure Resource Manager 部署模型. 也可根据需要通过 Az ...

  5. SqlServer数据库(可疑)的解决办法

    当数据库发生这种操作故障时,可以按如下操作步骤可解决此方法, 打开数据库里的Sql 查询编辑器窗口,运行以下的命令. // 1.使用指定值强制重新配置:(1.0表示为真假) sp_configure ...

  6. 10分钟开始.Net Core

    .Net Core 2.0发布了,API也越来越多.此时不用.Net Core,更待何时? 安装.Net Core SDK         首先,我们当然要先装.Net Core SDK,在这里下载( ...

  7. IOS Singleton(单例)

    Singleton.h // .h #define singleton_interface(class) + (instancetype)shared##class; // .m #define si ...

  8. 无法执行程序。所执行的命令为 "C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe" /noconfig /fullpaths @"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\b411ea32\b48a9fb\aun5r0xd.c

    解决方案 将应用程序池进程模型中的标识设为“LocalSystem”即可.

  9. python process,queue

    #-*- coding:utf-8 -*- from multiprocessing import Process,Queue import os,time,random def write(q): ...

  10. AngularJS 自定义指令directive 介绍

    --------------------------------------------------------------------------- 指令的作用是把我们自定义的语义化标签替换成浏览器 ...