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

main函数的两个参数,iOS中没有用到,包括这两个参数是为了与标准ANSI C保持一致。 UIApplicationMain函数,前两个和main函数一样,重点是后两个。后两个参数分别表示程序的主要类(principal class)和代理类(delegate class)。如果主要类(principal class)为nil,将从Info.plist中获取,如果Info.plist中不存在对应的key,则默认为UIApplication;如果代理类(delegate class)将在新建工程时创建。

1、每个应用程序都有属于自己的UIWindow(分为:1、状态栏,2、下面控制器控制的UIView),UIWindow继承自UIView

2、每个控制器都有默认的UIView.

3、一个控制器管理一个UIView.

 

在PC中,应用程序多是使用视窗的形式显示内容,手机应用也不例外,手机应用中要在屏幕上显示内容首先要创建一个窗口承载内容,iOS应用中使用UIWindow、UIView来实现内容显示。

UIWindow:

UIWindow对象是所有UIView的根视图,管理和协调的应用程序的显示、分发事件给View。UIWindow类是UIView的子类,可以看作是特殊的UIView。一般应用程序只有一个UIWindow对象,即使有多个UIWindow对象,也只有一个UIWindow可以接受到用户的触屏事件。UIWindow初始化在AppDeleDgate里面的didFinishLaunchingWithOptions方法。

UIView:

UIView类继承自UIResponder,负责在屏幕上定义一个矩形区域,视图用于展示界面及响应用户界面交互。每个视图对象都要负责渲染视图区域的内容,并响应该区域中发生的操作事件。除了显示内容和处理事件之外,视图可以嵌套并管理子视图。子视图是指嵌入到另一视图对象内部的视图对象,而被嵌入的视图对象是父视图。视图添加到window中就会显示出来。


 

根据UIApplicationMain函数,程序将进入AppDelegate.m,这个文件是xcode新建工程时自动生成的。

1、告诉代理进程启动但还没进入状态保存

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

2、在应用程序加载完毕之后调用

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

3、程序失去焦点的时候调用(不能跟用户进行交互了)当应用程序将要入非活动状态执行,在此期间,应用程序不接收消息或事件,比如来电话了

- (void)applicationWillResignActive:(UIApplication*)application

4、当应用程序获取焦点的时候调用-获取焦点之后才可以跟用户进行交互当应用程序入活动状态执行,这个刚好跟上面那个方法相反

- (void)applicationDidBecomeActive:(UIApplication*)application

5、当程序被推送到后台的时候调用。所以要设置后台继续运行,则在这个函数里面设置即可 (点击HOME键)

- (void)applicationDidEnterBackground:(UIApplication *)application

6、当程序从后台将要重新回到前台时候调用,这个刚好跟上面的那个方法相反。

- (void)applicationWillEnterForeground:(UIApplication *)application

7、当程序将要退出是被调用,通常是用来保存数据和一些退出前的清理工作。这个需要要设置UIApplicationExitsOnSuspend的键值。

- (void)applicationWillTerminate:(UIApplication *)application


 

初次启动:

iOS_didFinishLaunchingWithOptions

iOS_applicationDidBecomeActive

按下home键:

iOS_applicationWillResignActive

iOS_applicationDidEnterBackground

点击程序图标进入:

iOS_applicationWillEnterForeground

iOS_applicationDidBecomeActive


 

当应用程序进入后台时,应该保存用户数据或状态信息,所有没写到磁盘的文件或信息,在进入后台时,最后都写到磁盘去,因为程序可能在后台被杀死。释放尽可能释放的内存。

- (void)applicationDidEnterBackground:(UIApplication *)application

方法有大概5秒的时间让你完成这些任务。如果超过时间还有未完成的任务,你的程序就会被终止而且从内存中清除。

如果还需要长时间的运行任务,可以在该方法中调用:

[application beginBackgroundTaskWithExpirationHandler:^{

NSLog(@"begin Background Task With Expiration Handler");

}];

程序终止

程序只要符合以下情况之一,只要进入后台或挂起状态就会终止:

①iOS 4.0以前的系统

②app是基于iOS 4.0之前系统开发的。

③设备不支持多任务

④在Info.plist文件中,程序包含了 UIApplicationExitsOnSuspend 键。

系统常常是为其他app启动时由于内存不足而回收内存最后需要终止应用程序,但有时也会是由于app很长时间才响应而终止。如果app当时运行在后台并且没有暂停,系统会在应用程序终止之前调用app的代理的方法 - (void)applicationWillTerminate:(UIApplication *)application,这样可以让你可以做一些清理工作。你可以保存一些数据或app的状态。这个方法也有5秒钟的限制。超时后方法会返回程序从内存中清除。