SDK並沒有提供終止應用程序的方法。
要想終止應用程序,蘋果推薦的唯一的方式是按下Home按鈕。
但是Foundation框架中集成了Darwin框架,從而我們可以使用C函數exit(0)來終止Application。
UIApplication的openUrl方法則是退出應用程序的另一種方法。
當你在代碼中調用OpenURL方法時,你的App進程會被終止(掛起),另一個App則被喚醒。
當然兩種退出App的機制和最終效果並不相同。
當你使用exit(0)退出程序時,你的App並不僅僅是退出前台,程序所占用的內存也被清除了——這是不可恢復的。
如果再次Launch這個App,iOS將重新從磁盤中讀取二進制——這是一份全新的App映像。
openURL則不同,它僅僅是把你的程序掛起,這是可恢復的。
你的App僅僅是從前台退出,但後台中仍然存在著。
用戶可以在某個時候“喚醒”它,於是你的App又回來了,此時應用程序的狀態仍然喚醒之前的狀態。
當然,萬一你運氣不好,iOS也會將你的App徹底從內存中回收,
一如exit(0)所做的一樣,這一般是系統內存緊張的時候。
這兩種方法在某些時候可能需要並存。
例如,我們想在App退出之前,喚醒另一個App,比如Safari。
同時我們希望自己的App是真正的“退出”,回收App的所有內存。
這是一個“悖論”。因為無論exit(0)還是openURL,一旦執行之後,操作系統就會終止進程的執行。
只要執行二者中的任何一句語句,另外一個語句就無法執行——因為進程已經終止了。
但在某種情況下,通過對iOS多任務機制的巧妙利用,這個悖論卻是真實成立的。
例如,我們可以利用如下O-C代碼來實現這個目的:
[self performSelector:@selector(exitApp)withObject:nil afterDelay:0.5];
[[UIApplication sharedApplication]openURL:
[NSURLURLWithString:@"appScheme://"]];
exitApp方法實際上就是一句代碼exit(0)。
這樣二者就實現並存了。
首先,我們讓exit(0)延遲0.5秒再執行,而在此之前openURL當然早就執行完了。
performSelector:afterDelay方法將會調度一個任務在某個時間後執行。
當然,這個時間不能太長,】。
因為iOS允許app在進入後台之後仍然有一段“存活”時間,但是這個時間不能太長,
這樣即算後面的openURL方法執行後,App仍然處於存活狀態,也就有機會去執行所調度任務(即exit(0))。