iOS程序運行時的生命周期

程序啟動的完整過程:

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。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容