IOS UIApplication的核心做用

UIApplication的核心做用是提供了iOS程序運行期間的控制和協做工做。
app

iPhone應用程序是由主函數main啓動,它負責調用UIApplicationMain函數,該函數的形式以下所示: 
int UIApplicationMain ( 
int argc, 
char *argv[], 
NSString *principalClassName, 
NSString *delegateClassName 
); 
那麼UIApplicationMain函數到底作了哪些事情呢?這個函數主要負責三件 事情: 
函數


1)從給定的類名初始化應用程序對象,也就是初始化UIApplication或者子類對象的一個實例,若是你在這裏給定的是nil,那麼 系統會默認UIApplication類,也就主要是這個類來控制以及協調應用程序的運行。在後續的工做中,你能夠用靜態方法sharedApplication 來獲取應用程序的句柄。 
url


2)從給定的應用程序委託類,初始化一個應用程序委託。並把該委託設置爲應用程序的委託,這裏就有若是傳入參數爲nil,會調用函數訪問 Info.plist文件來尋找主nib文件,獲取應用程序委託。 spa


3)啓動主事件循環,並開始接收事件。
.net

上面是UIApplicationMain函數的工做,接下來一個問題是應用程序視圖的顯示、消息的控制怎麼辦?下面就是UIApplication(或 者子類)對象的職責,這個對象主要作下面幾件事: orm


1)負責處理到來的用戶事件,並分發事件消息到應該處理該消息的目標對象(sender,  action)。 
2)管理以及控制視圖,包括呈現、控制行爲、當前顯示視圖等。 
3)該對象有一個應用程序委託對象,當一些生命週期內重要事件(能夠包括系統事件或者生命週期控制事件)發生時,應用程序通知該對象。例如,應用程序啓 動、內存不夠了或者應用程序結束等,讓這些事件發生時,應用程序委託去響應。
對象

通 過上面的分析,能夠知道UIApplication對開發者來講,是一個黑箱,由於全部的操做,均可以由它的委託來幫咱們完成,它只須要在 後面維護一些不可更改的東西,如事件消息分發和傳遞、給委託發送事件處理請求等等,如,應用程序加載處理完畢,它會發送消息給委託,而後委託能夠在 applicationDidFinishLanching委託函數中去實現開發者想要的動做。利用XCODE在建立應用程序時,會默認實現一個應用程序 委託類。而對於加載的視圖,則有視圖相關的委託類來處理視圖加載過程的生命事件。下面說明委託主要能夠辦哪些事情: 
控制應用程序的行爲 
生命週期


- (void)applicationDidFinishLaunching:(UIApplication *)application 
          應用程序啓動完畢。 
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
        當因爲其它方法打開應用程序(如URL指定或者鏈接),通知委託啓動完畢 
- (void)applicationWillTerminate:(UIApplication *)application 
         通知委託,應用程序將在關閉 退出,請作一些清理工做。 
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application 
        通知委託,應用程序收到了爲來自系統的內存不足警告。-(void)applicationSignificantTimeChange:(UIApplication *)application 
      通知委託系統時間發生改變(主要是指時間屬性,而不是具體的時間值) 
打開URL 
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url 
           打開指定的URL 
控制狀態欄方位變化 
– application:willChangeStatusBarOrientation:duration: 
        設備方向將要發生改變 
– application:didChangeStatusBarOrientation: 
活動狀態改變 
- (void)applicationWillResignActive:(UIApplication *)application 
   通知委託應用程序將進入非活動狀態,在此期間,應用程序不接收消息或事件。-(void)applicationDidBecomeActive:(UIApplication *)application 
      通知委託應用程序進入活動狀態,請恢復數據 

能夠看到UIApplication的頭文件實現 
@interface UIApplication :UIResponder { 
@package 
id _delegate ;  //這就是應用程序委託。 
NSTimer ....... 

所以,在UIApplication中處理的系統事件時,只需轉到_delegate這個類去處理, 這個類對象就是應用程序委託對象。咱們能夠從應用程序的單例類對象中獲得應用程序委託的對象 
UIApplicationDelegate* myDelegate = [[UIApplication sharedApplication] delegate]; 

UIApplication 接收到全部的系統事件和生命週期事件時,都會把事件傳遞給UIApplicationDelegate進行處理,對於用戶輸入事件,則傳遞給相應的目標對象去處理。好比咱們在應用程序被來電等消息後,能夠調用應用程序委託類的 applicationWillResignActive()方法,這個方法在用戶鎖住屏幕時,也會調用,與之相適應的是應用程序從新被用戶打開時的委託 方法。另外經常使用的就是內存不足的系統警告,此時會調用應用程序委託類的applicationDidReceiveMemoryWarning()方法, 而後咱們就能夠試着釋放一些內存了。事件

相關文章
相關標籤/搜索