對于一個iOS app來講,生命周期是一個十分至關重要的東西。對于一個app來講控制著app的開啟、睡眠、關閉等狀態;對于一個頁面的來講,控制頁面的加載、顯示、消失;對于一個View或者一個普通的類來講,控制著初始化、繪制、釋放。
一、AppDelegate
當你創建一個iOS項目時,在appDelegate中你會看到如下六個方法,他們分別控制著不同的app生命周期
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
當app完成加載時,此方法會被調用。此方法在app啟動時只會執行一次。一般app的根窗口會在此方法中創建。調用后app處于激活狀態。launchOptions中包含很多用戶信息,可以通過如UIApplicationLaunchOptionsRemoteNotificationKey等Key來獲取相關的用戶信息
示例(非storyboard/xib方式):
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{ NSDictionary* userInfo = [launchOptions objectForKey: UIApplicationLaunchOptionsRemoteNotificationKey]; self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; self.viewController = [[ViewController alloc] init]; self.window.rootViewController = self.viewController; [self.window makeKeyAndVisible]; return YES;}
-(void)applicationWillResignActive:(UIApplication *)application;
當app正在使用時,遇到來電、鎖屏、回到home頁、跳轉到其他app并且app掛起不在后臺運行的時候,此方法會被調用。調用后app處于掛起狀態。此方法調用于applicationDidEnterBackground之前。
-(void)applicationDidEnterBackground:(UIApplication *)application;
當app正在使用時,遇到來電、鎖屏、回到home頁、跳轉到其他app并且app需要后臺運行的時候(蘋果允許local,music,voip,notifaction在后臺中運行),此方法會被調用。調用后app處于后臺運行狀態。
-(void)applicationWillEnterForeground:(UIApplication *)application;
當app從后臺運行狀態切換到前臺運行時,此方法會被調用。調用后app處于未激活狀態。此方法調用于applicationDidBecomeActive之前。
-(void)applicationDidBecomeActive:(UIApplication *)application;
當app被重新激活時,此方法會被調用。此方法應用在app之前已經被打開,但是不處于激活狀態,而在此跳轉到激活狀態的情況。每次跳轉到app中,此方法都會被調用。調用后app處于激活狀態。
-(void)applicationWillTerminate:(UIApplication *)application;
當手機關機或者雙擊home鍵,將app向上拖動致使完全退出時,此方法會被調用。此方法執行之后app的進程會被殺死。
二、UIViewController
對于一個頁面來講,你有8個生命周期可以控制
-(void)awakeFromNib;
但使用storyboard或者xib時,在讀取上面的布局之前,此方法會被調用。此方法早于其他方法調用,晚于初始化。在一個頁面中,此方法只會被調用一次。
-(void)viewDidLoad;
讀取storyboard或者xib的布局之后此方法會被調用。此方法晚于awakeFromNib調用,早于其他方法。在一個頁面中,此方法只會被調用一次。多用于初始化頁面布局與全局布局相關變量。
-(void)viewWillAppear:(BOOL)animated;
當頁面即將出現時,此方法會被調用。當頁面之間跳轉有動畫時,此方法在動畫開始時被調用。
-(void)viewDidAppear:(BOOL)animated;
當頁面已經完全出現時,此方法會被調用。當頁面之間跳轉有動畫時,此方法會在動畫結束時被調用。
-(void)viewWillDisappear:(BOOL)animated;
當頁面即將消失時,此方法被調用。當頁面之間跳轉有動畫時,此方法在動畫開始時被調用。
-(void)viewDidDisappear:(BOOL)animated;
當頁面已經完全消失時,此方法會被調用。當頁面之間跳轉有動畫時,此方法會在動畫結束時被調用。
-(void)viewWillLayoutSubviews;
當頁面布局即將發生全部變動時(多用于橫屏視屏翻轉),此方法會被調用,此方法在翻轉動畫開始時被調用。
-(void)viewDidLayoutSubViews;
當頁面布局變動結束時(多用于橫屏視屏翻轉),此方法會被調用,此方法在翻轉動畫結束時被調用。
三、View & NSObject
-(void)layoutSubviews;
當View中調用addSubView、view的Frame被重新設置、滾動一個UIScrollView、旋轉屏幕時,此方法會被調用。改變一個UIView大小的時候也會觸發父UIView上的layoutSubviews事件。
-(void)drawRect:(CGRect)rect;
重繪一個View時,此方法會被調用。
-(void)dealloc;
一個View或者NSObject被釋放時,此方法會被調用。NSNotification等可能會造成野指針、也通知的變量需要在此手動釋放。
新聞熱點
疑難解答