【iOS】被忽略的main函数

来源:互联网 发布:俄罗斯社交软件vk 编辑:程序博客网 时间:2024/06/05 02:45
如同任何基于C的应用程序,程序启动的主入口点为iOS应用程序的main函数。在iOS应用程序,main函数的作用是很少的。它的主要工作是控制UIKit framework。因此,你在Xcode中创建任何新的项目都配备了一个默认的主函数。除了少数特例外,你永远不应该改变这个函数的实现。
<ol class="linenums"><li value="1" class="L0"><span style="font-size: 16px;"><span style="color: rgb(0, 128, 128);"><span class="pln"> </span><span class="lit">1</span></span><span class="pln"> </span><span style="color: rgb(0, 0, 255);"><span class="com">#import</span></span><span class="com"> <UIKit/UIKit.h></span></span></li><li class="L1"><span style="font-size: 16px;"><span style="color: rgb(0, 128, 128);"><span class="pln"> </span><span class="lit">2</span></span><span class="pln"> </span></span></li><li class="L2"><span style="font-size: 16px;"><span style="color: rgb(0, 128, 128);"><span class="pln"> </span><span class="lit">3</span></span><span class="pln"> </span><span style="color: rgb(0, 0, 255);"><span class="com">#import</span></span><span class="com"> </span><span style="color: rgb(128, 0, 0);"><span class="com">"</span></span><span style="color: rgb(128, 0, 0);"><span class="com">AppDelegate.h</span></span><span style="color: rgb(128, 0, 0);"><span class="com">"</span></span></span></li><li class="L3"><span style="font-size: 16px;"><span style="color: rgb(0, 128, 128);"><span class="pln"> </span><span class="lit">4</span></span><span class="pln"> </span></span></li><li class="L4"><span style="font-size: 16px;"><span style="color: rgb(0, 128, 128);"><span class="pln"> </span><span class="lit">5</span></span><span class="pln"> </span><span style="color: rgb(0, 0, 255);"><span class="kwd">int</span></span><span class="pln"> main</span><span class="pun">(</span><span style="color: rgb(0, 0, 255);"><span class="kwd">int</span></span><span class="pln"> argc</span><span class="pun">,</span><span class="pln"> </span><span style="color: rgb(0, 0, 255);"><span class="kwd">char</span></span><span class="pln"> </span><span class="pun">*</span><span style="color: rgb(0, 0, 0);"><span class="pln"> argv</span><span class="pun">[])</span></span></span></li><li class="L5"><span style="font-size: 16px;"><span style="color: rgb(0, 128, 128);"><span class="pln"> </span><span class="lit">6</span></span><span class="pln"> </span><span style="color: rgb(0, 0, 0);"><span class="pun">{</span></span></span></li><li class="L6"><span style="font-size: 16px;"><span style="color: rgb(0, 128, 128);"><span class="pln"> </span><span class="lit">7</span></span><span class="pln"> </span><span style="color: rgb(0, 0, 0);"><span class="pln">    </span><span class="lit">@autoreleasepool</span><span class="pln"> </span><span class="pun">{</span></span></span></li><li class="L7"><span style="font-size: 16px;"><span style="color: rgb(0, 128, 128);"><span class="pln"> </span><span class="lit">8</span></span><span class="pln">         </span><span style="color: rgb(0, 0, 255);"><span class="kwd">return</span></span><span class="pln"> </span><span class="typ">UIApplicationMain</span><span class="pun">(</span><span class="pln">argc</span><span class="pun">,</span><span class="pln"> argv</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">nil</span><span class="pun">,</span><span class="pln"> </span><span class="typ">NSStringFromClass</span><span class="pun">([</span><span class="typ">AppDelegate</span><span class="pln"> </span><span style="color: rgb(0, 0, 255);"><span class="kwd">class</span></span><span style="color: rgb(0, 0, 0);"><span class="pun">]));</span></span></span></li><li class="L8"><span style="font-size: 16px;"><span style="color: rgb(0, 128, 128);"><span class="pln"> </span><span class="lit">9</span></span><span class="pln"> </span><span style="color: rgb(0, 0, 0);"><span class="pln">    </span><span class="pun">}</span></span></span></li><li class="L9"><span style="font-size: 16px;"><span style="color: rgb(0, 128, 128);"><span class="lit">10</span></span><span class="pln"> </span><span class="pun">}</span></span></li></ol>

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

函数原型:

<ol class="linenums"><li value="1" class="L0"><span style="font-size: 16px;"><span style="color: rgb(0, 128, 128);"><span class="lit">1</span></span><span class="pln"> UIKIT_EXTERN </span><span style="color: rgb(0, 0, 255);"><span class="kwd">int</span></span><span class="pln"> </span><span class="typ">UIApplicationMain</span><span class="pun">(</span><span style="color: rgb(0, 0, 255);"><span class="kwd">int</span></span><span class="pln"> argc</span><span class="pun">,</span><span class="pln"> </span><span style="color: rgb(0, 0, 255);"><span class="kwd">char</span></span><span class="pln"> </span><span class="pun">*</span><span class="pln">argv</span><span class="pun">[],</span><span class="pln"> </span><span class="typ">NSString</span><span class="pln"> </span><span class="pun">*</span><span class="pln">principalClassName</span><span class="pun">,</span><span class="pln"> </span><span class="typ">NSString</span><span class="pln"> </span><span class="pun">*</span><span class="pln">delegateClassName</span><span class="pun">);</span></span></li></ol>

参数解释:

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

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

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

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

<ol class="linenums"><li value="1" class="L0"><span style="font-size: 16px;"><span class="pun">-</span><span class="pln"> </span><span class="pun">(</span><span class="pln">BOOL</span><span class="pun">)</span><span class="pln">application</span><span class="pun">:(</span><span class="typ">UIApplication</span><span class="pln"> </span><span class="pun">*)</span><span class="pln">application willFinishLaunchingWithOptions</span><span class="pun">:(</span><span class="typ">NSDictionary</span><span class="pln"> </span><span class="pun">*)</span><span class="pln">launchOptions NS_AVAILABLE_IOS</span><span class="pun">(</span><span class="lit">6_0</span><span class="pun">);</span></span></li></ol>

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

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

在程序启动时:

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

<ol class="linenums"><li value="1" class="L0"><span style="font-size: 16px;"><span style="color: rgb(0, 128, 128);"><span class="lit">1</span></span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="pun">(</span><span class="pln">BOOL</span><span class="pun">)</span><span class="pln">application</span><span class="pun">:(</span><span class="typ">UIApplication</span><span class="pln"> </span><span class="pun">*)</span><span class="pln">application willFinishLaunchingWithOptions</span><span class="pun">:(</span><span class="typ">NSDictionary</span><span class="pln"> </span><span class="pun">*</span><span style="color: rgb(0, 0, 0);"><span class="pun">)</span><span class="pln">launchOptions NS_AVAILABLE_IOS</span><span class="pun">(</span><span class="lit">6_0</span><span class="pun">);</span></span></span></li><li class="L1"><span style="font-size: 16px;"><span style="color: rgb(0, 128, 128);"><span class="lit">2</span></span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="pun">(</span><span class="pln">BOOL</span><span class="pun">)</span><span class="pln">application</span><span class="pun">:(</span><span class="typ">UIApplication</span><span class="pln"> </span><span class="pun">*)</span><span class="pln">application didFinishLaunchingWithOptions</span><span class="pun">:(</span><span class="typ">NSDictionary</span><span class="pln"> </span><span class="pun">*)</span><span class="pln">launchOptions NS_AVAILABLE_IOS</span><span class="pun">(</span><span class="lit">3_0</span><span class="pun">);</span></span></li></ol>

①检查启动选项字典中的内容,查看程序启动的方式,并做出适当的反应。 
②初始化应用程序的关键数据结构。 
③准备好你的应用程序的窗口和视图进行显示。 
使用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;方法来完成过渡到前台。因为这种方法既在启动时与从后台过渡到前台时被调用,使用它来执行所共有的两个转变的任何任务。

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

0 0
原创粉丝点击