自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

從“Hello World”看iOS應(yīng)用的生命周期

移動開發(fā) iOS
做iPhone開發(fā)首先第一件就是得知道iPhone程序的生命周期,只有理解了這個才能游刃有余的掌握iPhone程序的開發(fā),否則在寫程序的時候有點渾渾僵僵不知所以然的感覺。

在前面我們給大家介紹了iOS高效開發(fā)必備的10款Objective-C類庫,本文我們將介紹從“Hello World”看iOS應(yīng)用的生命周期。

做iPhone開發(fā)首先***件就是得知道iPhone程序的生命周期,說白點就是當(dāng)點擊程序圖標(biāo)啟動程序開始到退出程序整個使用運行過程中底下的代碼都發(fā)生了什么,只有理解了這個才能游刃有余的掌握iPhone程序的開發(fā),否則在寫程序的時候有點渾渾僵僵不知所以然的感覺。首先忘記Xcode給我們生成的代碼模板,忘記xib忘記ib,我們親自一行一行來寫一個Hello World程序,雖然真正開發(fā)項目的時候并不需要這樣做Xcode模板和ib都會為我們做好這些打雜的事情,但是現(xiàn)在完全由我們自己來寫,放心這個程序是個非常的簡單的Hello World 程序,代碼也很少總共加起來不過10幾行。

在這之前我們先來看看Objective-C語言的關(guān)于這段協(xié)議代碼:

  1. @protocol SimpleProtocol  
  2. -(void)doSomething:(NSString *)str;  
  3. @end  
  4. @interface SimpleClass:NSObject< SimpleProtocol >{  
  5. }  
  6. @end  
  7. @implementation SimpleClass  
  8. -(void) doSomething:(NSString *)str{   
  9.    NSLog(str);  
  10. }  
  11. @end 

這樣是一個簡單的協(xié)議示例,類SimpleClasss實現(xiàn)了名為SimpleProtocol的協(xié)議。協(xié)議在其它語言里跟接口非常類似,記住這個協(xié)議的實現(xiàn),接下來會有用的。

接下來用Xcode新建一個名為HelloWorld的Window-based Application類型的項目。大體上講一下項目的文件結(jié)構(gòu),由Xcode模板生成的項目主要包含Classes(Hello World Appdelegate.h和Hello World Appdelegate.m)、Other Sources(main.m和Hello World_Prefix.pch)、Resources(Main Window.xib和Hello World-info.plist)、Frameworks(iPhone SDK提供的系統(tǒng)框架)、Products(Hello World.app)這幾部分。直接運行這個工程會在模擬器里看到一個白色的顯示界面程序,由此可見沒寫一行代碼Xcode已經(jīng)給我們生成了一個很簡單的項目模板。

每一個iPhone程序都包含一個UIApplication對象,它管理整個程序的生命周期,從加載***個顯示界面開始,并且監(jiān)聽系統(tǒng)事件、程序事件調(diào)度整個程序的執(zhí)行。那么上面這個簡單項目中的UI Application對象在哪呢?在這個項目中我們找不到任何關(guān)于UI Application的代碼,其實在項目中UI Application對象是由UI Application Main方法初始化到內(nèi)存中,首先打開Other Sources文件夾下的main.m源文件,里面只包括了一個main方法,和所有的C程序一樣這個是程序入口。代碼如下:

  1. int main(int argc, char *argv[]) {  
  2.     NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];  
  3.     int retVal = UIApplicationMain(argc, argv, nil, nil);  
  4.     [pool release];  
  5.     return retVal;  

在main函數(shù)中第二行代碼UI Application Main(argc, argv, nil, nil);對UIApplication對象進(jìn)行了初始化,這個方法除了argc 和 argv 參數(shù)外,另外這個函數(shù)還有2個兩個字符串參數(shù)來識別UI Application類和UI Application代理類,在這里默認(rèn)是2個nil,***個參數(shù)為nil就默認(rèn)把UI Application類作為缺省值進(jìn)行初始化,可以在這里不填nil而是使用自己定義的UI Application子類。至于第二個參數(shù)nil就設(shè)置為nil就把模板生成的Hello World Appdelegate類作為默認(rèn)值。這里有了UI Application對象怎么又出來一個UI Application代理類對象呢?這里需要說明UI Application對象說是管理整個程序的生命周期其實它是什么具體的事情都不干,它只負(fù)責(zé)監(jiān)聽事件當(dāng)需要做實際工作的時候就交給UI Application代理類去做,UI Application相當(dāng)于傳令官負(fù)責(zé)只把命令傳達(dá)給UI Application代理類這個士兵,然后由這個士兵真正去沖鋒陷陣,所以需要給UI Application對象設(shè)置代理類。

非常不好意思寫了一堆羅嗦的文字還沒有進(jìn)入正題,不過這些羅嗦還是非常有必要的,現(xiàn)在開始編寫我們的***個iPhone程序helloWorld。上面不是說了要忘記代碼模板,忘記xib忘記Interfcae Builder嘛,這樣我們把模板自動生成的部分刪除了,找到Other Sources文件下main.m刪除,找到Classes文件夾下的Hello World Appdelegate.h和Hello World Appdelegate.m刪除,把Resources文件夾下的Main Window.xib刪除,還有一件事情一定要做那就是打開Resources文件夾下Hello World-info.plist,然后找到key為“Main nib file base name”刪除因為在上面我們已經(jīng)刪除了Main Window.xib,這樣就完成的工程的清理,變成了一個真正的空的工程沒有什么實現(xiàn)代碼。

完成上面的清理工作后,接下來開著我們的編寫,首先新建程序入口main.m文件已經(jīng)main方法,程序從這里開始!代碼如下:

  1. int main(int argc, char *argv[]) {  
  2.     NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];  
  3.     int retVal = UIApplicationMain(argc, argv, nil, @”SampleDelegate”);  
  4.     [pool release];  
  5.     return retVal;  
  6. }     

NSAutoreleasePool內(nèi)存自動釋放池這個干什么我就不說了,你懂得的。這里主要看一下第二行UI Application Main(argc, argv, nil, nil);與模板生成的相比改成UI Application Main(argc, argv, nil, @”SampleDelegate”);這樣做我們?yōu)閁I Application對象設(shè)置了名為SampleDelegate代理類,上面不是說了UI Application是不處理具體事情的,真正做事的是UI Application代理類,這個名為SampleDelegate代理類就是我們需要具體寫代碼實現(xiàn)的,當(dāng)UI Application初始化后就開始監(jiān)聽事件,根據(jù)不同的監(jiān)聽事件讓SampleDelegate代理類做不同的處理,比如顯示***個顯示界面。

新建名為SampleDelegate.m的類,在SampleDelegate.h輸入如下代碼:

  1. @interface SampleDelegate : NSObject<UIApplicationDelegate> {  
  2. }  
  3. @end 

注意到?jīng)]有,SampleDelegate: NSObject <UIApplicationDelegate>這個寫法是不是很眼熟 ,在看看最上面那段Objective-C語言的關(guān)于協(xié)議代碼,SimpleClass類需要實現(xiàn)SimpleProtocol協(xié)議定義的方法,這樣看來UIApplicationDelegate是一個協(xié)議定義,同樣SampleDelegate也需要實現(xiàn)UI Application Delegate中定義的方法,只是這個協(xié)議是系統(tǒng)定義好的(具體可以參看UI Application Delegate.h)而SimpleProtocol是我們自己定義的,但是要做的事情相同,就是SampleDelegate需要去實現(xiàn)這UI Application Delegate協(xié)議定義好的方法, 這些方法就是UI Application對象監(jiān)聽到系統(tǒng)變化的時候通知UI Application對象代理類SampleDelegate執(zhí)行的相應(yīng)方法。下面是SampleDelegate的實現(xiàn)代碼寫在SampleDelegate.m中注意到?jīng)]有,SampleDelegate: NSObject <UIApplicationDelegate>這個寫法是不是很眼熟 ,在看看最上面那段Objective-C語言的關(guān)于協(xié)議代碼,SimpleClass類需要實現(xiàn)SimpleProtocol協(xié)議定義的方法,這樣看來UI Application Delegate是一個協(xié)議定義,同樣SampleDelegate也需要實現(xiàn)UI Application Delegate中定義的方法,只是這個協(xié)議是系統(tǒng)定義好的(具體可以參看UI Application Delegate.h)而SimpleProtocol是我們自己定義的,但是要做的事情相同,就是SampleDelegate需要去實現(xiàn)這UI Application Delegate協(xié)議定義好的方法, 這些方法就是UI Application對象監(jiān)聽到系統(tǒng)變化的時候通知UI Application對象代理類SampleDelegate執(zhí)行的相應(yīng)方法。下面是SampleDelegate的實現(xiàn)代碼寫在SampleDelegate.m中:

  1. @implementation SampleDelegate  
  2. - (void)applicationWillResignActive:(UIApplication *)application{}  
  3. - (void)applicationDidBecomeActive:(UIApplication *)application{}  
  4. - (void)applicationDidEnterBackground:(UIApplication *)application{}  
  5. - (void)applicationWillEnterForeground:(UIApplication *)application{}  
  6. - (void)applicationWillTerminate:(UIApplication *)application{}  
  7. - (void)applicationDidReceiveMemoryWarning:(UIApplication *)application{}  
  8. - (void)applicationSignificantTimeChange:(UIApplication*)application{}  
  9. - (void)applicationDidFinishLaunching:(UIApplication*)application{}  
  10. - (void)application:(UIApplication*)application willChangeStatusBarFrame:(CGRect)newStatusBarFrame{}  
  11. - (void)application:(UIApplication*)application willChangeStatusBarOrientation:(UIInterfaceOrientation)newStatusBarOrientation duration:(NSTimeInterval)duration{}  
  12. - (BOOL)application:(UIApplication*)application handleOpenURL:(NSURL*)url{  
  13.          return YES;  
  14. }  
  15. - (void)application:(UIApplication*)application didChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientation{}  
  16. - (void)application:(UIApplication*)application didChangeSetStatusBarFrame:(CGRect)oldStatusBarFrame{}  
  17. @end 

現(xiàn)在來看協(xié)議中定義的這些需要實現(xiàn)的方法分別是什么作用:

◆- (void)applicationWillResignActive:(UIApplication *)application

說明:當(dāng)應(yīng)用程序?qū)⒁敕腔顒訝顟B(tài)執(zhí)行,在此期間,應(yīng)用程序不接收消息或事件,比如來電話了

◆- (void)applicationDidBecomeActive:(UIApplication *)application

說明:當(dāng)應(yīng)用程序入活動狀態(tài)執(zhí)行,這個剛好跟上面那個方法相反

◆- (void)applicationDidEnterBackground:(UIApplication *)application

說明:當(dāng)程序被推送到后臺的時候調(diào)用。所以要設(shè)置后臺繼續(xù)運行,則在這個函數(shù)里面設(shè)置即可

◆- (void)applicationWillEnterForeground:(UIApplication *)application

說明:當(dāng)程序從后臺將要重新回到前臺時候調(diào)用,這個剛好跟上面的那個方法相反。

◆- (void)applicationWillTerminate:(UIApplication *)application

說明:當(dāng)程序?qū)⒁顺鍪潜徽{(diào)用,通常是用來保存數(shù)據(jù)和一些退出前的清理工作。這個需要要設(shè)置UIApplicationExitsOnSuspend的鍵值。

◆- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application

說明:iPhone設(shè)備只有有限的內(nèi)存,如果為應(yīng)用程序分配了太多內(nèi)存操作系統(tǒng)會終止應(yīng)用程序的運行,在終止前會執(zhí)行這個方法,通常可以在這里進(jìn)行內(nèi)存清理工作防止程序被終止

◆- (void)applicationSignificantTimeChange:(UIApplication*)application

說明:當(dāng)系統(tǒng)時間發(fā)生改變時執(zhí)行

◆- (void)applicationDidFinishLaunching:(UIApplication*)application

說明:當(dāng)程序載入后執(zhí)行

◆- (void)application:(UIApplication)application willChangeStatusBarFrame:(CGRect)newStatusBarFrame

說明:當(dāng)StatusBar框?qū)⒁兓瘯r執(zhí)行

◆- (void)application:(UIApplication*)application willChangeStatusBarOrientation:

  1. (UIInterfaceOrientation)newStatusBarOrientation  
  2. duration:(NSTimeInterval)duration 

說明:當(dāng)StatusBar框方向?qū)⒁兓瘯r執(zhí)行

◆- (BOOL)application:(UIApplication*)application handleOpenURL:(NSURL*)url

說明:當(dāng)通過url執(zhí)行

◆- (void)application:(UIApplication*)application didChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientation

說明:當(dāng)StatusBar框方向變化完成后執(zhí)行

◆- (void)application:(UIApplication*)application didChangeSetStatusBarFrame:(CGRect)oldStatusBarFrame

說明:當(dāng)StatusBar框變化完成后執(zhí)行

下圖是我總結(jié)的一個大概流程圖,不是很準(zhǔn)確但是基本上也說明了整個過程,僅供參考。

流程圖

到這為止我們的這個程序運行起來還是什么都沒有看到,確實我們也沒有寫具體的功能代碼,接下來我們要做的就是在屏幕上顯示“Hello World!”,首先知道一下要在屏幕上顯示,首先需要一個UIWindow對象,這個你可以認(rèn)為是一個電視機(jī),然后還需要往這個UIWindow對象里添加UIView對象, UIView相當(dāng)于電視上一幕一幕的畫面。通過上面的流程知道要在程序后顯示可以在applicationDidFinishLaunching方法中處理,這樣修改applicationDidFinishLaunching方法如下:

  1. - (void)applicationDidFinishLaunching:(UIApplication*)application{  
  2.          UIWindow *window=[[UIWindow alloc]initWithFrame:[[UIScreen mainScreen] bounds]];  
  3.          SampleViewController *viewctrl=[[SampleViewController alloc]init];  
  4.          [window addSubview:viewctrl.view];  
  5.          [window makeKeyAndVisible];  

上面的代碼中做了如下幾件事情:

◆實例化了一個UIWindow對象

◆實例化了SampleViewController對象

◆把SampleViewController對象UIView對象添加到UIWindow對象中

◆顯示UIWindow對象

看這段代碼我們并沒有直接實例化一個UIView對象然后添加給UIWindow對象而且通過SampleViewController對象,它是UIViewController子類負(fù)責(zé)視圖的顯示控制,非常的好用,在這里我們只是實現(xiàn)了loadView就夠了,我們只要簡單的顯示一下“Hello World!”文字, 具體代碼如下:

  1. @interface SampleViewController : UIViewController {}  
  2. @end  
  3. @implementation SampleViewController  
  4. -(void)loadView{  
  5.          UIView *contentView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];  
  6.          contentView.backgroundColor = [UIColor blackColor];  
  7.          self.view = contentView;  
  8.          [contentView release];  
  9.          CGRect labelFrame = CGRectMake(40.0f, 200.0f, 240.0f, 60.0f);  
  10.          UILabel *frontLabel = [[UILabel alloc] initWithFrame:labelFrame];  
  11.          frontLabel.text = @"Hello World!";  
  12.          frontLabel.font = [UIFont fontWithName:@"Georgia" size:24.0f];  
  13.          frontLabel.textColor = [UIColor colorWithRed:0.82f green:1.0f blue:0.286f alpha:1.0f];  
  14.          frontLabel.backgroundColor = [UIColor colorWithRed:0.0f green:0.0f blue:0.0f alpha:0.0f];  
  15.          [contentView addSubview:frontLabel];  
  16.          [frontLabel release];      
  17. }  
  18. @end 

到這里我們已經(jīng)完成的Hello World程序的編寫,點擊運行就能看到如下的效果圖:

效果圖  

【編輯推薦】

  1. 開發(fā)iOS應(yīng)用程序前需要解決的十大問題
  2. iPhone開發(fā)關(guān)于icon和Default及圖片處理方法
  3. iPhone有效利用 十大iOS免費網(wǎng)管應(yīng)用程序
  4. 開發(fā)者傳授打造iPhone手機(jī)游戲項目攻略
  5. 斯坦福大學(xué)iPhone開發(fā)中文字幕視頻教程 持續(xù)更新中
責(zé)任編輯:佚名
相關(guān)推薦

2015-07-09 15:42:48

ios應(yīng)用生命周期

2012-06-20 10:29:16

敏捷開發(fā)

2013-07-29 05:11:38

iOS開發(fā)iOS開發(fā)學(xué)習(xí)類的'生命周期'

2014-07-16 13:39:30

Windows Pho

2015-07-08 16:28:23

weak生命周期

2014-07-11 11:09:10

App應(yīng)用程序生命周期

2009-06-24 10:34:39

JSF生命周期JSF應(yīng)用程序

2013-07-31 14:50:32

Windows PhoWP應(yīng)用程序生命周期

2022-04-19 07:20:24

軟件開發(fā)安全生命周期SSDLC應(yīng)用安全

2012-12-04 10:02:03

2011-08-10 16:50:10

iPhone生命周期

2023-04-19 07:50:59

?云原生生命周期管理

2011-07-20 15:58:58

iPhone 應(yīng)用程序 生命周期

2013-12-06 17:52:08

2016-04-13 09:59:21

WOT2016云智慧

2009-06-11 11:28:35

JSF生命周期

2010-07-14 10:48:37

Perl線程

2009-06-18 13:32:39

Java線程生命周期

2012-04-28 13:23:12

Java生命周期

2011-06-16 09:31:21

ActivityAndroid
點贊
收藏

51CTO技術(shù)棧公眾號