iOS | UIApplication sharedApplication詳細解釋

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

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

2)從給定的應用程序委托類,初始化一個應用程序委托。并把該委托設置為應用程序的委托,這里就有如果傳入參數為nil,會調用函數訪問 Info.plist文件來尋找主nib文件,獲取應用程序委托。

3)啟動主事件循環,并開始接收事件。

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

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
    通知委托應用程序進入活動狀態,請恢復數據
    1.設置icon上的數字圖標

    //設置主界面icon上的數字圖標,在2.0中引進, 缺省為0
    [UIApplicationsharedApplication].applicationIconBadgeNumber = 4;

2.設置搖動手勢的時候,是否支持redo,undo操作

//搖動手勢,是否支持redo undo操作。
//3.0以后引進,缺省YES
[UIApplicationsharedApplication].applicationSupportsShakeToEdit =YES;

3.判斷程序運行狀態

   //判斷程序運行狀態,在2.0以后引入
   if([UIApplicationsharedApplication].applicationState ==UIApplicationStateInactive){
        NSLog(@"程序在運行狀態");
    }

4.阻止屏幕變暗進入休眠狀態

//阻止屏幕變暗,慎重使用,缺省為no 2.0
[UIApplicationsharedApplication].idleTimerDisabled =YES;

慎重使用本功能,因為非常耗電。

5.顯示聯網狀態

//顯示聯網標記 2.0
[UIApplicationsharedApplication].networkActivityIndicatorVisible =YES;

6.在map上顯示一個地址

NSString* addressText =@"1 Infinite Loop, Cupertino, CA 95014";
   // URL encode the spaces
    addressText =  [addressTextstringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];
   NSString* urlText = [NSStringstringWithFormat:@"http://maps.google.com/maps?q=%@", addressText];
   
    [[UIApplicationsharedApplication]openURL:[NSURLURLWithString:urlText]];

7.發送電子郵件

NSString *recipients =@"mailto:first@example.com?cc=second@example.com,third@example.com&subject=Hello from California!";
NSString *body =@"&body=It is raining in sunny California!";

NSString *email = [NSStringstringWithFormat:@"%@%@", recipients, body];
email = [emailstringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

[[UIApplicationsharedApplication]openURL:[NSURLURLWithString:email]];

8.打電話到一個號碼

// Call Google 411
[[UIApplicationsharedApplication]openURL:[NSURLURLWithString:@"tel://8004664411"]];

9.發送短信
// Text to Google SMS
[[UIApplicationsharedApplication]openURL:[NSURLURLWithString:@"sms://466453"]];

10.打開一個網址

// Lanuch any iPhone developers fav site
[[UIApplicationsharedApplication]openURL:[NSURLURLWithString:@"http://itunesconnect.apple.com"]];

可以看到UIApplication的頭文件實現
@interface UIApplication :UIResponder <UIActionSheetDelegate>{
@package
id<UIApplicationDelegate> _delegate ; //這就是應用程序委托。
NSTimer .......
}
因此,在UIApplication中處理的系統事件時,只需轉到_delegate這個類去處理, 這個類對象就是應用程序委托對象。我們可以從應用程序的單例類對象中得到應用程序委托的對象
UIApplicationDelegate* myDelegate = [[UIApplication sharedApplication] delegate];

UIApplication 接收到所有的系統事件和生命周期事件時,都會把事件傳遞給UIApplicationDelegate進行處理,對于用戶輸入 事件,則傳遞給相應的目標對象去處理。比如我們在應用程序被來電等消息后,可以調用應用程序委托類的 applicationWillResignActive()方法,這個方法在用戶鎖住屏幕時,也會調用,與之相適應的是應用程序重新被用戶打開時的委托 方法。另外常用的就是內存不足的系統警告,此時會調用應用程序委托類的applicationDidReceiveMemoryWarning()方法, 然后我們就可以試著釋放一些內存了。

上面就是應用程序生命周期(啟動,中止,恢復,退出等過程)的應用程序處理UIApplication sharedApplication

本文由zhudameng213貢獻
ppt文檔可能在WAP端瀏覽體驗不佳。建議您優先選擇TXT,或下載源文件到本機查看。
20120221
IOS應用程序生命周期
UIViewController的生命周期
程序的生命周期
程序的生命周期是指應用程序啟動到應用程序結束整個 階段的全過程 每一個IOS應用程序都包含一個UIApplication對象, IOS系統通過該UIApplication對象監控應用程序生命周 期全過程 每一個IOS應用程序都要為其UIApplication對象指定一 個代理對象,并由該代理對象處理UIApplication對象監 測到的應用程序生命周期事件。
IOS應用程序5種狀態
Not running:應用還沒有啟動,或者應用正在運行但是途中被系
統停止
Inactive:當前應用正在前臺運行,但是并不接收事件(當前 或許
正在執行其它代碼)。一般每當應用要從一個狀態切換到另一個不 同的狀態時,中途過渡會短暫停留在此狀態。唯一在此狀態停留時 間比較長的情況是:當用戶 鎖屏時,或者系統提示用戶去響應某 些(諸如電話來電、有未讀短信等)事件的時候。
Active:當前應用正在前臺運行,并且接收事件。這是應用正在前
臺運行時所處的正常狀態。
Background:應用處在后臺,并且還在執行代碼。大多數將 要進
入Suspended狀態的應用,會先短暫進入此狀態。然而,對于請求 需要額外的執行時間的應用,會在此狀態保持更長一段時間。另外, 如果一個應用要 求啟動時直接進入后臺運行,這樣的應用會直接 從Not running狀態進入Background狀態,中途不會經過Inactive狀 態。比如沒有界面的應用。注此處并不特指沒有界面的應用,其實 也可以是 有界面的應用,只是如果要直接進入background狀態的 話,該應用界面不會被顯示。
Suspended:應用處在后臺,并且已停止執行代碼。系統自動 的
將應用移入此狀態,且在此舉之前不會對應用做任何通知。當處在 此狀態時,應用依然駐留內存但不執行任何程序代碼。當系統發生 低內存告警時,系統將會將處 于Suspended狀態的應用清除出內 存以為正在前臺運行的應用提供足夠的內存。
創建UIApplication對象并指定其代理
通過UIApplicationMain函數創建UIApplication對象并 指定其代理對象AppDelegate;第三個參數為指定 UIApplication的子類來生成UIApplication對象,為nil時由 UIApplication類初始化默認對象;第四個參數為指定代理 對象。
UIApplication的代理對象
作為UIApplication的代理類,必須要先實現 UIApplicationDelegate協議,協議里明確了作為代理應 該做或可以做哪些事情。 UIApplication對象負責監聽應用程序的生命周期事件, 并將生命周期事件交由UIApplication代理對象處理。
UIApplication代理對象生命周期函數詳解

  • (void)applicationWillResignActive:(UIApplication *)application
    說明:當應用程序將要入非活動狀態執行,在此期間,應用 程
    序不接收消息或事件,比如來電話了
  • (void)applicationDidBecomeActive:(UIApplication *)application
    說明:當應用程序入活動狀態執行,這個剛好跟上面那個方 法相反
  • (void)applicationDidEnterBackground:(UIApplication *)application
    說明:當程序被推送到后臺的時候調用。所以要設置后臺繼 續運行,則在這個函數里面設置即可
    UIApplication代理對象生命周期函數詳解
  • (void)applicationWillEnterForeground:(UIApplication *)application
    說明:當程序從后臺將要重新回到前臺時候調用,這個剛好 跟上面的那個方法相反。
  • (void)applicationWillTerminate:(UIApplication *)application
    說明:當程序將要退出是被調用,通常是用來保存數據和一 些退出前的清理工作。這個需要要設置 UIApplicationExitsOnSuspend的鍵值
    (void)applicationDidReceiveMemoryWarning:(UIApplic ation )application
    說明:ios設備只有有限的內存,如果為應用程序分配了太多 內存操作系統會終止應用程序的運行,在終止前會執行這個 方法,通常可以在這里進行內存清理工作防止程序被終止
    UIApplication代理對象生命周期函數詳解
    (void)applicationDidFinishLaunching:(UIApplication
    )a pplication
    說明:當程序載入后執行。
  • (BOOL)application:(UIApplication)application handleOpenURL:(NSURL)url
    說明:當打開URL時執行。
    UIViewController
    UIViewController是IOS頂層視圖的載體及控制器,用戶 與程序界面的交互都是由UIViewController來控制的。 UIViewController管理UIView的生命周期及資源的加載 與釋放。
    UIView UIView與UIWindow共同展示了應用用戶界面。
    UIViewController生命周期事件
    -(void)loadView
    加載視圖資源并初始化視圖
  • (void)viewDidLoad - (void)viewDidUnload
    釋放視圖資源
  • (void)viewWillAppear:(BOOL)animated
    將要加載出視圖
  • (void)viewDidAppear:(BOOL)animated
    視圖出現
  • (void)viewWillDisappear:(BOOL)animated
    視圖即將消失
  • (void)viewDidDisappear:(BOOL)animated
    視圖已經消失

原文出處: UIApplication sharedApplication詳細解釋

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,763評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,238評論 3 428
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,823評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,604評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,339評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,713評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,712評論 3 445
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,893評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,448評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,201評論 3 357
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,397評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,944評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,631評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,033評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,321評論 1 293
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,128評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,347評論 2 377

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,818評論 18 139
  • -- iOS事件全面解析 概覽 iPhone的成功很大一部分得益于它多點觸摸的強大功能,喬布斯讓人們認識到手機其實...
    翹楚iOS9閱讀 2,987評論 0 13
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結起來就是把...
    Dove_iOS閱讀 27,197評論 30 471
  • 挺哥上廁所去了,李青師姐說要嚇她,于是躲在了桌子底下,想著挺哥一回來就嚇他一跳。挺哥上廁所回來以后發現李青師姐不在...
    姚嚴閱讀 125評論 0 0
  • 就著轉型這個大潮,迎著“互聯網+”這個大浪,介休涌現出一個個商家聯盟,抱團取暖,勢在必行! 親愛的介休商...
    汪溝小子閱讀 413評論 0 0