欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

從HelloWorld來看iphone應(yīng)用程序的生命周期

系統(tǒng) 1895 0

學(xué)習(xí)iphone開發(fā)首先第一件事就是得知道iphone應(yīng)用程序的生命周期,說白點就是當(dāng)點擊程序圖標(biāo)啟動程序開始到退出程序整個使用運行過程中底下的代碼都發(fā)生了什么,只有理解了這個才能游刃有余的掌握iPhone程序的開發(fā),否則在寫程序的時候有點渾渾僵僵不知所以然的感覺。首先忘記Xcode給我們生成的代碼模板,忘記Interface Builder,我們手動編寫一個HelloWorld程序。真正開發(fā)項目的時候并不需要這樣做,Xcode模板和Interface Builder都會為我們做好這些事情。

我們先來看看object-c語言的關(guān)于這段協(xié)議代碼:

@protocol SimpleProtocol

-(void)doSomething:(NSString *)str;

@end

@interface SimpleClass:NSObject< SimpleProtocol >{

}

@end

@implementationSimpleClass

-(void) doSomething:(NSString*)str{

NSLog(str);

}

@end

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

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

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

int main(int argc, char *argv[]) {

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

int retVal = UIApplicationMain(argc, argv, nil, nil);

[pool release];

return retVal;

}

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

現(xiàn)在開始編寫我們的第一個iPhone程序helloWorld。把模板自動生成的某些部分刪除了,將HelloWorldAppdelegate.h和HelloWorldAppdelegate.m刪除,將MainWindow.xib刪除,還有就是打開HelloWorld-info.plist,然后找到key為“Main nib file base name”刪除這一行,因為我們已經(jīng)刪除了MainWindow.xib。

程序入口main.m文件中main方法代碼如下:

int main(int argc, char *argv[]) {

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

int retVal = UIApplicationMain(argc, argv, nil, @”SampleDelegate”);

[pool release];

return retVal;

}

第二行UIApplicationMain(argc, argv, nil,nil)與模板生成的相比改成UIApplicationMain(argc, argv, nil,@”SampleDelegate”),這樣做我們?yōu)閁IApplication對象設(shè)置了名為SampleDelegate代理類,上面不是說了UIApplication是不處理具體事情的,真正做事的是UIApplication代理類,這個名為SampleDelegate代理類就是我們需要具體寫代碼實現(xiàn)的,當(dāng)UIApplication初始化后就開始監(jiān)聽事件,根據(jù)不同的監(jiān)聽事件讓SampleDelegate代理類做不同的處理,比如顯示第一個顯示界面。

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

@interface SampleDelegate :NSObject<UIApplicationDelegate> {

}

@end

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

@implementation SampleDelegate

- (void)applicationWillResignActive:(UIApplication *)application{}

- (void)applicationDidBecomeActive:(UIApplication *)application{}

- (void)applicationDidEnterBackground:(UIApplication *)application{}

- (void)applicationWillEnterForeground:(UIApplication *)application{}

- (void)applicationWillTerminate:(UIApplication *)application{}

- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application{}

- (void)applicationSignificantTimeChange:(UIApplication*)application{}

- (void)applicationDidFinishLaunching:(UIApplication*)application{}

- (void)application:(UIApplication*)application willChangeStatusBarFrame:(CGRect)newStatusBarFrame{}

- (void)application:(UIApplication*)application willChangeStatusBarOrientation:(UIInterfaceOrientation)newStatusBarOrientationduration:(NSTimeInterval)duration{}

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

return YES;

}

- (void)application:(UIApplication*)application didChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientation{}

- (void)application:(UIApplication*)application didChangeSetStatusBarFrame:(CGRect)oldStatusBarFrame{}

@end

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

1、-(void)applicationWillResignActive:(UIApplication *)application

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

2、-(void)applicationDidBecomeActive:(UIApplication *)application

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

3、- (void)applicationDidEnterBackground:(UIApplication*)application

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

4、-(void)applicationWillEnterForeground:(UIApplication *)application

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

5、-(void)applicationWillTerminate:(UIApplication *)application

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

6、-(void)applicationDidReceiveMemoryWarning:(UIApplication *)application

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

7、-(void)applicationSignificantTimeChange:(UIApplication*)application

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

8、-(void)applicationDidFinishLaunching:(UIApplication*)application

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

9、-(void)application:(UIApplication)application willChangeStatusBarFrame:(CGRect)newStatusBarFrame

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

10、-(void)application:(UIApplication*)application willChangeStatusBarOrientation:

(UIInterfaceOrientation)newStatusBarOrientation

duration:(NSTimeInterval)duration

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

11、-(BOOL)application:(UIApplication*)application handleOpenURL:(NSURL*)url

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

12、-(void)application:(UIApplication*)applicationdidChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientation

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

13、-(void)application:(UIApplication*)applicationdidChangeSetStatusBarFrame:(CGRect)oldStatusBarFrame

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

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

從HelloWorld來看iphone應(yīng)用程序的生命周期

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

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

UIWindow *window=[[UIWindow alloc]initWithFrame:[[UIScreen mainScreen] bounds]];

SampleViewController *viewctrl=[[SampleViewController alloc]init];

[windowaddSubview:viewctrl.view];

[windowmakeKeyAndVisible];

}

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

1、 實例化了一個UIWindow對象

2、 實例化了SampleViewController對象

3、 把SampleViewController對象UIView對象添加到UIWindow對象中

4、 顯示UIWindow對象

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

@interface SampleViewController : UIViewController {}

@end

@implementation SampleViewController

-(void)loadView{

UIView *contentView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];

contentView.backgroundColor = [UIColor blackColor];

self.view = contentView;

[contentView release];

CGRect labelFrame = CGRectMake(40.0f, 200.0f, 240.0f, 60.0f);

UILabel *frontLabel = [[UILabel alloc] initWithFrame:labelFrame];

frontLabel.text = @"Hello World!";

frontLabel.font = [UIFont fontWithName:@"Georgia" size:24.0f];

frontLabel.textColor = [UIColor colorWithRed:0.82f green:1.0f blue:0.286f alpha:1.0f];

frontLabel.backgroundColor = [UIColor colorWithRed:0.0f green:0.0f blue:0.0f alpha:0.0f];

[contentViewaddSubview:frontLabel];

[frontLabelrelease];

}

@end

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

從HelloWorld來看iphone應(yīng)用程序的生命周期

從HelloWorld來看iphone應(yīng)用程序的生命周期


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚洲高清国产品国语在线观看 | 日韩一区二区在线视频 | 日本精品a在线 | 国产精品热 | 不卡视频一区二区 | 日韩超碰| 日韩欧美精品综合一区二区三区 | 亚洲精品一区久久久久久 | 欧美综合自拍亚洲综合网 | 欧美金妇欧美乱妇视频 | 欧美不卡视频 | y4480午夜66| 青娱分类视频精品免费2 | 毛片激情永久免费 | 色偷偷成人网免费视频男人的天堂 | 国产精品一区二区久久久久 | 亚洲国产成人在线 | 天天躁日日躁aaaa视频 | 国产精品久久久久久久久免费 | 日韩视频在线播放 | 91欧美激情一区二区三区成人 | 亚洲免费中文字幕 | 毛片少妇爽到高潮特黄A片 六月色播 | 国产一级毛片视频 | 久草 在线 | 久操伊人 | 午夜在线观看免费视频 | 午夜资源 | 午夜播放器在线观看 | 欧美一区免费 | 伊人2222 | 欧美日韩国产一区二区三区 | 国产日产亚洲欧美综合另类 | 国产在亚洲线视频观看 | 91精品国产综合久久久久久 | 国内精品久久久久久2021浪潮 | 亚洲精品一区二区三区蜜桃久 | 91精品国产综合久久久久久 | 激情 一区| 日韩成人精品在线 | 亚洲欧美在线免费观看 |