日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

iOS开发UI篇 程序启动原理和UIApplication

發(fā)布時間:2024/4/14 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iOS开发UI篇 程序启动原理和UIApplication 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

2019獨角獸企業(yè)重金招聘Python工程師標準>>>

一、UIApplication

1.簡單介紹

(1)UIApplication對象是應用程序的象征,一個UIApplication對象就代表一個應用程序。

(2)每一個應用都有自己的UIApplication對象,而且是單例的,如果試圖在程序中新建一個UIApplication對象,那么將報錯提示。

(3)通過[UIApplication sharedApplication]可以獲得這個單例對象

(4)?一個iOS程序啟動后創(chuàng)建的第一個對象就是UIApplication對象,且只有一個(通過代碼獲取兩個UIApplication對象,打印地址可以看出地址是相同的)。

(5)利用UIApplication對象,能進行一些應用級別的操作

2.應用級別的操作示例:

1)設置應用程序圖標右上角的紅色提醒數(shù)字(如QQ消息的時候,圖標上面會顯示1,2,3條新信息等。)

@property(nonatomic)?NSInteger?applicationIconBadgeNumber;

代碼實現(xiàn)和效果:?

-?(void)viewDidLoad {[super?viewDidLoad];????//創(chuàng)建并添加一個按鈕UIButton?*btn=[[UIButton?alloc]initWithFrame:CGRectMake(100,?100,?60,?30)];[btn?setTitle:@"按鈕"?forState:UIControlStateNormal];[btn?setBackgroundColor:[UIColor?brownColor]];[btn?addTarget:self?action:@selector(onClick)?forControlEvents:UIControlEventTouchUpInside];[self.view?addSubview:btn]; } -(void)onClick {NSLog(@"按鈕點擊事件");????//錯誤,只能有一個唯一的UIApplication對象,不能再進行創(chuàng)建//????UIApplication?*app=[[UIApplication?alloc]init];????//通過sharedApplication獲取該程序的UIApplication對象UIApplication?*app=[UIApplication?sharedApplication];????app.applicationIconBadgeNumber=123;}

2)設置聯(lián)網(wǎng)指示器的可見性

@property(nonatomic,getter=isNetworkActivityIndicatorVisible)?BOOL?networkActivityIndicatorVisible;

代碼和效果:?

??//設置指示器的聯(lián)網(wǎng)動畫app.networkActivityIndicatorVisible=YES;

3)管理狀態(tài)欄

從iOS7開始,系統(tǒng)提供了2種管理狀態(tài)欄的方式

a.通過UIViewController管理(每一個UIViewController都可以擁有自己不同的狀態(tài)欄).

在iOS7中,默認情況下,狀態(tài)欄都是由UIViewController管理的,UIViewController實現(xiàn)下列方法就可以輕松管理狀態(tài)欄的可見性和樣式

狀態(tài)欄的樣式  ???- (UIStatusBarStyle)preferredStatusBarStyle;?

狀態(tài)欄的可見性  -(BOOL)prefersStatusBarHidden;

#pragma?mark-設置狀態(tài)欄的樣式 -(UIStatusBarStyle)preferredStatusBarStyle {????//設置為白色????//return?UIStatusBarStyleLightContent;????//默認為黑色return?UIStatusBarStyleDefault; }#pragma?mark-設置狀態(tài)欄是否隱藏(否) -(BOOL)prefersStatusBarHidden {????return?NO; }

b.通過UIApplication管理(一個應用程序的狀態(tài)欄都由它統(tǒng)一管理)

如果想利用UIApplication來管理狀態(tài)欄,首先得修改Info.plist的設置

?

代碼:

??//通過sharedApplication獲取該程序的UIApplication對象UIApplication?*app=[UIApplication?sharedApplication];app.applicationIconBadgeNumber=123;????//設置指示器的聯(lián)網(wǎng)動畫app.networkActivityIndicatorVisible=YES;????//設置狀態(tài)欄的樣式????//app.statusBarStyle=UIStatusBarStyleDefault;//默認(黑色)????//設置為白色+動畫效果[app?setStatusBarStyle:UIStatusBarStyleLightContent?animated:YES];????//設置狀態(tài)欄是否隱藏app.statusBarHidden=YES;??????//設置狀態(tài)欄是否隱藏+動畫效果[app?setStatusBarHidden:YES?withAnimation:UIStatusBarAnimationFade];

c.補充

既然兩種都可以對狀態(tài)欄進行管理,那么什么時候該用什么呢?

如果狀態(tài)欄的樣式只設置一次,那就用UIApplication來進行管理;

如果狀態(tài)欄是否隱藏,樣式不一樣那就用控制器進行管理。

UIApplication來進行管理有額外的好處,可以提供動畫效果。

?4)openURL:方法

UIApplication有個功能十分強大的openURL:方法

- (BOOL)openURL:(NSURL*)url;

openURL:方法的部分功能有

打電話??UIApplication *app = [UIApplicationsharedApplication];?[app openURL:[NSURLURLWithString:@"tel://10086"]];

發(fā)短信??[app openURL:[NSURLURLWithString:@"sms://10086"]];

發(fā)郵件??[app openURL:[NSURLURLWithString:@"mailto://12345@qq.com"]];

打開一個網(wǎng)頁資源?[app openURL:[NSURLURLWithString:@"http://ios.itcast.cn"]];

打開其他app程序???openURL方法,可以打開其他APP。

?URL補充:

URL:統(tǒng)一資源定位符,用來唯一的表示一個資源。

URL格式:協(xié)議頭://主機地址/資源路徑

網(wǎng)絡資源:http/ ftp等?? 表示百度上一張圖片的地址?? http://www.baidu.com/images/20140603/abc.png

本地資源:file:///users/apple/desktop/abc.png(主機地址省略)

?

二、UIApplication Delegate

1.簡單說明

所有的移動操作系統(tǒng)都有個致命的缺點:app很容易受到打擾。比如一個來電或者鎖屏會導致app進入后臺甚至被終止。

還有很多其它類似的情況會導致app受到干擾,在app受到干擾時,會產(chǎn)生一些系統(tǒng)事件,這時UIApplication會通知它的delegate對象,讓delegate代理來處理這些系統(tǒng)事件。

作用:當被打斷的時候,通知代理進入到后臺。

每次新建完項目,都有個帶有“AppDelegate”字眼的類,它就是UIApplication的代理,NJAppDelegate默認已經(jīng)遵守了UIApplicationDelegate協(xié)議,已經(jīng)是UIApplication的代理。

2.代理方法

?1?#import?"YYAppDelegate.h"?2??3?@implementation?YYAppDelegate?4??5?//?當應用程序啟動完畢的時候就會調用(系統(tǒng)自動調用)?6?-?(BOOL)application:(UIApplication?*)application?didFinishLaunchingWithOptions:(NSDictionary?*)launchOptions?7?{?8?????NSLog(@"didFinishLaunchingWithOptions");?9?????return?YES;10?}11?12?//?即將失去活動狀態(tài)的時候調用(失去焦點,?不可交互)13?-?(void)applicationWillResignActive:(UIApplication?*)application14?{15?????NSLog(@"ResignActive");16?}17?18?//?重新獲取焦點(能夠和用戶交互)19?-?(void)applicationDidBecomeActive:(UIApplication?*)application20?{21?????NSLog(@"BecomeActive");22?}23?24?//?應用程序進入后臺的時候調用25?//?一般在該方法中保存應用程序的數(shù)據(jù),?以及狀態(tài)26?-?(void)applicationDidEnterBackground:(UIApplication?*)application27?{28?????NSLog(@"Background");29?}30?31?//?應用程序即將進入前臺的時候調用32?//?一般在該方法中恢復應用程序的數(shù)據(jù),以及狀態(tài)33?-?(void)applicationWillEnterForeground:(UIApplication?*)application34?{35?????NSLog(@"Foreground");36?}37?38?//?應用程序即將被銷毀的時候會調用該方法39?//?注意:如果應用程序處于掛起狀態(tài)的時候無法調用該方法40?-?(void)applicationWillTerminate:(UIApplication?*)application41?{42?}43?44?//?應用程序接收到內存警告的時候就會調用45?//?一般在該方法中釋放掉不需要的內存46?-?(void)applicationDidReceiveMemoryWarning:(UIApplication?*)application47?{48?????NSLog(@"MemoryWarning");49?}50?@end

應用程序一般有五個狀態(tài):官方文檔app.states

?

三、程序啟動原理

UIApplicationMain

main函數(shù)中執(zhí)行了一個UIApplicationMain這個函數(shù)

intUIApplicationMain(int?argc,?char?*argv[],?NSString?*principalClassName,?NSString?*delegateClassName);

argc、argv:直接傳遞給UIApplicationMain進行相關處理即可?

principalClassName:指定應用程序類名(app的象征),該類必須是UIApplication(或子類)。如果為nil,則用UIApplication類作為默認值

?delegateClassName:指定應用程序的代理類,該類必須遵守UIApplicationDelegate協(xié)議

UIApplicationMain函數(shù)會根據(jù)principalClassName創(chuàng)建UIApplication對象,根據(jù)delegateClassName創(chuàng)建一個delegate對象,并將該delegate對象賦值給UIApplication對象中的delegate屬性

接著會建立應用程序的Main Runloop(事件循環(huán)),進行事件的處理(首先會在程序完畢后調用delegate對象的application:didFinishLaunchingWithOptions:方法)

程序正常退出時UIApplicationMain函數(shù)才返回

按 Ctrl+C 復制代碼

按 Ctrl+C 復制代碼

?

系統(tǒng)入口的代碼和參數(shù)說明:

argc:系統(tǒng)或者用戶傳入的參數(shù)

argv:系統(tǒng)或用戶傳入的實際參數(shù)?

1.根據(jù)傳入的第三個參數(shù),創(chuàng)建UIApplication對象

2.根據(jù)傳入的第四個產(chǎn)生創(chuàng)建UIApplication對象的代理

3.設置剛剛創(chuàng)建出來的代理對象為UIApplication的代理

4.開啟一個事件循環(huán)(可以理解為里面是一個死循環(huán))這個時間循環(huán)是一個隊列(先進先出)先添加進去的先處理

?

ios程序啟動原理

?四、程序啟動的完整過程

1.main函數(shù)

2.UIApplicationMain

* 創(chuàng)建UIApplication對象

* 創(chuàng)建UIApplication的delegate對象

?

3.delegate對象開始處理(監(jiān)聽)系統(tǒng)事件(沒有storyboard)

* 程序啟動完畢的時候, 就會調用代理的application:didFinishLaunchingWithOptions:方法

* 在application:didFinishLaunchingWithOptions:中創(chuàng)建UIWindow

* 創(chuàng)建和設置UIWindow的rootViewController

* 顯示窗口

?

3.根據(jù)Info.plist獲得最主要storyboard的文件名,加載最主要的storyboard(有storyboard)

* 創(chuàng)建UIWindow

* 創(chuàng)建和設置UIWindow的rootViewController

* 顯示窗口?

UIApplication的代理事件 ?Xcode解釋

// 1. 應用程序啟動完成,會調用此方法,啟動之后,將不再調用此方法!
// 如果因為內存等原因,應用程序被操作系統(tǒng)干掉,再次點擊圖標,會調用此方法!
- (
BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
???
NSLog(@"應用程序啟動");
???
???
return YES;
}

// 2. 應用程序注銷激活狀態(tài),游戲應該再此方法中暫停游戲進程!此方法在游戲開發(fā)中尤為重要!
- (
void)applicationWillResignActive:(UIApplication *)application
{
???
NSLog(@"%s", __func__);
???
???
// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
???
// Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
}

// 3. 應用程序退出到后臺,釋放共享資源,保存用戶數(shù)據(jù),停止時鐘,保存足夠的應用程序狀態(tài)信息...
- (
void)applicationDidEnterBackground:(UIApplication *)application
{
???
NSLog(@"%s", __func__);
???
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
???
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}

// 4. 應用程序進入前臺,如果在進入后臺保存數(shù)據(jù)等操作,在此方法中,回復進入后臺的操作
- (
void)applicationWillEnterForeground:(UIApplication *)application
{
???
NSLog(@"%s", __func__);
???
// 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.
}

// 5. 應用程序變成活動狀態(tài),重新啟動原來暫停的狀態(tài)
- (
void)applicationDidBecomeActive:(UIApplication *)application
{
???
NSLog(@"%s", __func__);
???
// 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.
}

// 6. 應用程序將被終止
- (
void)applicationWillTerminate:(UIApplication *)application
{
???
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}

@end


轉載于:https://my.oschina.net/kaqijiang/blog/596407

總結

以上是生活随笔為你收集整理的iOS开发UI篇 程序启动原理和UIApplication的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。