我們第一次打開Xcode的iOS應用模版時舔清,首先會讓我們?nèi)リP(guān)注的是應用的主函數(shù)蔼夜,也就是一個程序的入口矩欠。工程里的主函數(shù)main.m就是這個樣子的
#import <UIKit/UIKit.h>#import "AppDelegate.h"int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
一看~這個主函數(shù)好簡介啊猾蒂,只用了一個函數(shù)询一,就建立起了我們的應用隐孽。
點擊進入查看官方文檔癌椿,可以發(fā)現(xiàn)其中的前兩個參數(shù)和我們熟悉的C語言主函數(shù)的入口的參數(shù)相同,如果學過C應該很容易理解菱阵。所以讓我們來看看后面兩個參數(shù)踢俄。第三個參數(shù)大多是nil
,它的類型是NSString *
,代表應用程序單例UIApplication
的名字,如果填入nil
就代表是模板給我們創(chuàng)建好的該對象送粱。后面一個是應用程序代理褪贵,這里用到了iOS常用的委托代理的模式。用一個UIResponder
類的實例AppDelegate
作為這個應用的委托對象抗俄。雖然官方文檔里這個函數(shù)的有返回值int但是這個函數(shù)卻不會返回東西脆丁。原因就在于iOS APP的一個運行機制。
可以把一個APP想象成一個運行時不會終止动雹,一直等待事件
發(fā)生的循環(huán)體槽卫,叫做The Main Run Loop
。(事件包括兩類:一類是對屏幕的點擊胰蝠,一類是搖動或按耳機鍵等等歼培。)
So,在任何時間你的APP只會處于下面這幾個狀態(tài):
狀態(tài) | 界面是否可見 | 是否接收事件 | 是否能執(zhí)行代碼 |
---|---|---|---|
未運行 Not running | 否 | 否 | 否 |
激活 Active | 是 | 是 | 是 |
未激活 Inactive | 大部分 | 否 | 是 |
后臺運行 Background | 否 | 否 | 是 |
掛起 Suspended | 否 | 否 | 否 |
相應的會觸發(fā)AppDelegate.m
中的以下方法(這些方法在UIApplicationDelegate協(xié)議中):PS:身邊有電腦的童鞋茸塞,也可以隨意打開一個項目躲庄,在以下方法中加入這句代碼NSLog(@"%@", NSStringFromSelector(_cmd));
然后在調(diào)用這個方法的時候就會在控制臺打印出該方法的名字niao > ~ <
1. 未運行 Not running -> 激活 Active
- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
NSLog(@"%@", NSStringFromSelector(_cmd)); retrun YES;
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSLog(@"%@", NSStringFromSelector(_cmd)); // Override point for customization after application launch. return YES;
}
- (void)applicationDidBecomeActive:(UIApplication *)application{
NSLog(@"%@", NSStringFromSelector(_cmd));
// Restart any tasks that were paused (or not yet started) while the application was inactive.
// If the application was previously in the background, optionally refresh the user interface.
}
2.激活 Active -> 未激活 Inactive (eg. 當按下home鍵 或 接入電話時觸發(fā))
- (void)applicationWillResignActive:(UIApplication *)application{ NSLog(@"%@", NSStringFromSelector(_cmd));
}
3.未激活 Inactive -> 后臺運行 Background
- (void)applicationDidEnterBackground:(UIApplication *)application{
NSLog(@"%@", NSStringFromSelector(_cmd));
}
4.后臺運行 Background -> 掛起 Suspended ( 系統(tǒng)在APP進入后臺狀態(tài)大概 5秒 后自動觸發(fā)狀態(tài)改變)
5.掛起 Suspended -> 激活 Active(eg.重新點擊圖標時觸發(fā))
- (void)applicationWillEnterForeground:(UIApplication *)application{
NSLog(@"%@", NSStringFromSelector(_cmd));
// Called as part of the transition from the background to the inactive state
// here you can undo many of the changes made on entering the background.
}
6.掛起 Suspended -> 未運行 Not running(退出APP時調(diào)用,可以在這里保存數(shù)據(jù))
- (void)applicationWillTerminate:(UIApplication *)application{
NSLog(@"%@", NSStringFromSelector(_cmd));
//Save data if appropriate.
}
結(jié)(fei)語(hua):
1.UIApplicationDelegate協(xié)議中還不止這8個方法钾虐,但是列出來的這個幾個用得比較多也比較典型噪窘。有興趣的可以查閱UIApplicationDelegate協(xié)議官方文檔。
2.第一次寫簡書效扫,好累啊T—T
但是如果能給各位看官提供到一點點幫助倔监,也就有了價值。
從寫的過程中也收獲不少吧~以后每周都堅持寫一點菌仁,歡迎大家關(guān)注浩习!
相互學習,共同進步济丘。