項目中出現了一個消息角標設置的bug,涉及到UIApplication對象的處理。在此記錄下加深對UIApplication的理解。windows
1、UIApplication的基礎認識瀏覽器
UIApplication是應用級別的一個單例。咱們一個應用啓動到內存釋放始終且只對應一個UIApplication對象,此對象控制着應用級別的交互,如打開其它應用等。此外其代理提供給咱們應用啓動、退出到後臺、從新進入、退出等操做。app
一、UIApplication對象屬性函數
windows 添加的windowoop
keyWindow 程序的主window,程序在每一個時刻只能有一個主window。好比每一個警告框就是一個window可是在每個時刻只能有一個主window。當警告框顯示的時候警告框就是主window。同理鍵盤事件也是同樣。動畫
networkActivityIndicatorVisible 聯網可見性url
statusBarStyle 狀態欄樣式.net
statusBarHidden 狀態欄的顯示代理
statusBarOrientation 狀態欄方向對象
statusBarOrientationAnimationDuration 當改變狀態欄的時候動畫的改變時間
statusBarFrame 狀態欄的frame(沒有隱藏的時候)
applicationIconBadgeNumber 程序圖案icon圖上的角標
applicationSupportsShakeToEdit 搖一搖
applicationState App此時的狀態(正在前臺運行或進入後臺掛起)
backgroundTimeRemaining 進入後臺後能夠執行的時間(當程序進入後臺後,能夠運行代碼的時間是有限的,若是延長了執行時間此屬性會返回總共剩餘時間)
- (BOOL)openURL:(NSURL*)url 可經過此方法打開其它程序(吊起電話或者打開瀏覽器等)
二、UIApplicationDetegate--程序代理
當App被打開、處於前臺運行狀態、被事件打斷運行、home鍵進入後臺、從新進入前臺運行、內存警告、退出等咱們都能經過UIApplicationDetegate的代理事件拿到相關接口。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
app啓動完成的時候,執行此通知,在此咱們初始化界面什麼的。也就是平時咱們寫的。
return YES;
}
- (void)applicationWillResignActive:(UIApplication *)application {
當App不活躍的時候,暫時掛起的狀態好比接入電話等。注意當home鍵返回桌面,程序進入後臺的時候並不會觸發此通知
}
- (void)applicationDidEnterBackground:(UIApplication *)application {
當咱們點擊home鍵返回桌面程序進入後天的時候觸發此通知。此時iOS系統容許程序能夠有5s鐘的時間運行代碼。固然能夠向系統申請更長的運行時間可是程序在後臺不能存活過10分鐘,10分鐘事後會系統會強制掛起程序。若是內存吃緊的話,會釋放此App所佔用的內存給其餘程序使用。
}
- (void)applicationWillEnterForeground:(UIApplication *)application {
從後臺到前臺的一個過渡時間段
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
程序變爲活躍狀態,注意的是程序啓動或者當程序在後臺內存尚未被系統回收處於掛起狀態(內存被回收後點擊App會從新啓動,沒有被回收點擊App直接回到按home鍵時的界面)都會走此方法。
}
- (void)applicationWillTerminate:(UIApplication *)application {
程序退出時執行的方法。好比雙擊home鍵後將程序上劃退出。
}
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application{
發生內存警告時觸發的方法
}
// 當應用程序啓動完畢的時候就會調用(系統自動調用)
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSLog(@"didFinishLaunchingWithOptions");
return YES;
}
2、程序的建立和退出
每一個項目中都有一個main函數,它是咱們App和系統的接口,建立運行App:
int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
UIApplicationMain建立了UIApplicationnil(nil--系統默認傳入一個UIApplication)和UIApplicationDelegate(NSStringFromClass([AppDelegate class])。此外其還幫咱們開啓了一個runloop,就是循環-死循環。runloop中不斷的監聽各類的系統事件,好比home鍵有沒有按下、有沒有接入電話等等。當監聽到後會觸發對應的代理方法如home鍵按下後讓程序進入後臺並觸發AppDelegate中的系統進入後臺的方法,執行咱們的代碼。