程序啟動的完整過程:
1、先執行main函數,main內部會調用UIApplicationMain函數,該函數的聲明如下:
intUIApplicationMain(intargc,charargv[], NSString principalClassName, NSString *delegateClassName)。
argc、argv:標準main函數的參數,直接傳遞給UIApplicationMain進行相關處理即可
principalClassName:指定應用程序類,該類必須是UIApplication(或子類)。如果為nil,則用UIApplication類作為默認值
delegateClassName:指定應用程序類的代理類,該類必須遵守UIApplicationDelegate協議。
2、在UIApplicationMain函數里面做了如下幾件事情:
(1)、根據傳入的第三個參數創建UIApplication對象或它的子類對象。如果該參數為nil,直接使用該UIApplication來創建。(該參數只能傳人UIApplication或者是它的子類)
(2)、根據傳入的第四個參數創建AppDelegate對象,并將該對象賦值給第1步創建的UIApplication對象的delegate屬性。
(3)、開啟一個事件循環,循環監控應用程序發生的事件。每監聽到對應的系統事件時,就會通知AppDelegate。
AppDelegate中的方法:
//程序已經啟動完成
- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
returnYES;
}
//程序即將失去焦點
- (void)applicationWillResignActive:(UIApplication*)application {
}
//程序已經進入后臺
- (void)applicationDidEnterBackground:(UIApplication*)application {
}
//程序將要進入前臺
- (void)applicationWillEnterForeground:(UIApplication*)application {
}
//程序即將獲得焦點
- (void)applicationDidBecomeActive:(UIApplication*)application {
}
//程序即將銷毀terminate-銷毀
- (void)applicationWillTerminate:(UIApplication*)application {
}
執行順序:
/**
啟動時:
didFinishLaunchingWithOptions,程序啟動完成->
applicationDidBecomeActive,程序即將獲得焦點->
進入后臺時:
applicationWillResignActive,程序即將失去焦點->
applicationDidEnterBackground,程序已經進入后臺->
再次進入前臺時:
applicationWillEnterForeground,程序將要進入前臺->
applicationDidBecomeActive,程序即將獲得焦點->
一直死循環進行
*/
當程序收到內存警告時:
- (void)didReceiveMemoryWarning {
[superdidReceiveMemoryWarning];
//調用此方法
}
當應用程序接收到內存警告的時候怎么處理?
答:當收到內存警告的時候,應用程序會將警告一級一級往下傳遞,傳遞順序是UIApplication->UIWindow->rootViewController(如果有子控制器)->childViewControllers。
當控制器接收到警告之后,就會調用didReceiveMemoryWarning方法。一般會在這個方法中做幾件事:
1、在iOS6之前的處理方式:
a.調用每個控制器的didReceiveMemoryWarning方法,在該方法中判斷控制器的view是否存在,
如果存在,系統又會判斷view是否可以被銷毀(只要控制器的view不是正在顯示在界面上。那么系統就會認為該view是可以被銷毀的).
b.如果可以銷毀,控制器會調用viewWillUnload銷毀view并設置view屬性的值為nil并保存跟view屬性相關的數據,以便重新重建view的時候可以恢復.
c.最后調用控制器的viewDidUnload方法,在viewDidUnload方法中釋放所有view強引用的子控件。重寫這三個方法的時候必須要調用父類的方法。
2、在iOS6之后的處理方式如下:
- (void)didReceiveMemoryWarning
{
[superdidReceiveMemoryWarning];
// Add code to clean up any of your own resources that are no longer necessary.
if([self.view window] ==nil)
{
// Add code to preserve data stored in the views that might be
// needed later.
// Add code to clean up other strong references to the view in
// the view hierarchy.
self.view =nil;
}
}
1>調用父類的didReceiveMemoryWarning來確保父類的行為能夠被執行。
2>清理控制器不再需要的資源
3>判斷控制器的view是不是正在在窗口上顯示,如果不是,先保存跟view或子view相關的數據。清空所有子控件的強引用。
4>最后設置控制器的view為nil。