`

从“Hello World”看iOS应用的生命周期[转]

 
阅读更多

做iPhone开发首先第一件就是得知道iPhone程序的生命周期,说白点就是当点击程序图标启动程序开始到退出程序整个使用运行过程中底下的代码都发生了什么,只有理解了这个才能游刃有余的掌握iPhone程序的开发,否则在写程序的时候有点浑浑僵僵不知所以然的感觉。首先忘记Xcode给我们生成的代码模板,忘记xib忘记ib,我们亲自一行一行来写一个Hello World程序,虽然真正开发项目的时候并不需要这样做Xcode模板和ib都会为我们做好这些打杂的事情,但是现在完全由我们自己来写,放心这个程序是个非常的简单的Hello World 程序,代码也很少总共加起来不过10几行。

在这之前我们先来看看Objective-C语言的关于这段协议代码:

  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 

这样是一个简单的协议示例,类SimpleClasss实现了名为SimpleProtocol的协议。协议在其它语言里跟接口非常类似,记住这个协议的实现,接下来会有用的。

接下来用Xcode新建一个名为HelloWorld的Window-based Application类型的项目。大体上讲一下项目的文件结构,由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提供的系统框架)、Products(Hello World.app)这几部分。直接运行这个工程会在模拟器里看到一个白色的显示界面程序,由此可见没写一行代码Xcode已经给我们生成了一个很简单的项目模板。

每一个iPhone程序都包含一个UIApplication对象,它管理整个程序的生命周期,从加载第一个显示界面开始,并且监听系统事件、程序事件调度整个程序的执行。那么上面这个简单项目中的UI Application对象在哪呢?在这个项目中我们找不到任何关于UI Application的代码,其实在项目中UI Application对象是由UI Application Main方法初始化到内存中,首先打开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函数中第二行代码UI Application Main(argc, argv, nil, nil);对UIApplication对象进行了初始化,这个方法除了argc 和 argv 参数外,另外这个函数还有2个两个字符串参数来识别UI Application类和UI Application代理类,在这里默认是2个nil,第一个参数为nil就默认把UI Application类作为缺省值进行初始化,可以在这里不填nil而是使用自己定义的UI Application子类。至于第二个参数nil就设置为nil就把模板生成的Hello World Appdelegate类作为默认值。这里有了UI Application对象怎么又出来一个UI Application代理类对象呢?这里需要说明UI Application对象说是管理整个程序的生命周期其实它是什么具体的事情都不干,它只负责监听事件当需要做实际工作的时候就交给UI Application代理类去做,UI Application相当于传令官负责只把命令传达给UI Application代理类这个士兵,然后由这个士兵真正去冲锋陷阵,所以需要给UI Application对象设置代理类。

非常不好意思写了一堆罗嗦的文字还没有进入正题,不过这些罗嗦还是非常有必要的,现在开始编写我们的第一个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”删除因为在上面我们已经删除了Main Window.xib,这样就完成的工程的清理,变成了一个真正的空的工程没有什么实现代码。

完成上面的清理工作后,接下来开着我们的编写,首先新建程序入口main.m文件已经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内存自动释放池这个干什么我就不说了,你懂得的。这里主要看一下第二行UI Application Main(argc, argv, nil, nil);与模板生成的相比改成UI Application Main(argc, argv, nil, @”SampleDelegate”);这样做我们为UI Application对象设置了名为SampleDelegate代理类,上面不是说了UI Application是不处理具体事情的,真正做事的是UI Application代理类,这个名为SampleDelegate代理类就是我们需要具体写代码实现的,当UI Application初始化后就开始监听事件,根据不同的监听事件让SampleDelegate代理类做不同的处理,比如显示第一个显示界面。

新建名为SampleDelegate.m的类,在SampleDelegate.h输入如下代码:

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

注意到没有,SampleDelegate: NSObject <UIApplicationDelegate>这个写法是不是很眼熟 ,在看看最上面那段Objective-C语言的关于协议代码,SimpleClass类需要实现SimpleProtocol协议定义的方法,这样看来UIApplicationDelegate是一个协议定义,同样SampleDelegate也需要实现UI Application Delegate中定义的方法,只是这个协议是系统定义好的(具体可以参看UI Application Delegate.h)而SimpleProtocol是我们自己定义的,但是要做的事情相同,就是SampleDelegate需要去实现这UI Application Delegate协议定义好的方法, 这些方法就是UI Application对象监听到系统变化的时候通知UI Application对象代理类SampleDelegate执行的相应方法。下面是SampleDelegate的实现代码写在SampleDelegate.m中注意到没有,SampleDelegate: NSObject <UIApplicationDelegate>这个写法是不是很眼熟 ,在看看最上面那段Objective-C语言的关于协议代码,SimpleClass类需要实现SimpleProtocol协议定义的方法,这样看来UI Application Delegate是一个协议定义,同样SampleDelegate也需要实现UI Application Delegate中定义的方法,只是这个协议是系统定义好的(具体可以参看UI Application Delegate.h)而SimpleProtocol是我们自己定义的,但是要做的事情相同,就是SampleDelegate需要去实现这UI Application Delegate协议定义好的方法, 这些方法就是UI Application对象监听到系统变化的时候通知UI Application对象代理类SampleDelegate执行的相应方法。下面是SampleDelegate的实现代码写在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 

现在来看协议中定义的这些需要实现的方法分别是什么作用:

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

说明:当应用程序将要入非活动状态执行,在此期间,应用程序不接收消息或事件,比如来电话了

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

说明:当应用程序入活动状态执行,这个刚好跟上面那个方法相反

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

说明:当程序被推送到后台的时候调用。所以要设置后台继续运行,则在这个函数里面设置即可

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

说明:当程序从后台将要重新回到前台时候调用,这个刚好跟上面的那个方法相反。

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

说明:当程序将要退出是被调用,通常是用来保存数据和一些退出前的清理工作。这个需要要设置UIApplicationExitsOnSuspend的键值。

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

说明:iPhone设备只有有限的内存,如果为应用程序分配了太多内存操作系统会终止应用程序的运行,在终止前会执行这个方法,通常可以在这里进行内存清理工作防止程序被终止

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

说明:当系统时间发生改变时执行

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

说明:当程序载入后执行

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

说明:当StatusBar框将要变化时执行

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

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

说明:当StatusBar框方向将要变化时执行

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

说明:当通过url执行

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

说明:当StatusBar框方向变化完成后执行

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

说明:当StatusBar框变化完成后执行

下图是我总结的一个大概流程图,不是很准确但是基本上也说明了整个过程,仅供参考。

流程图

到这为止我们的这个程序运行起来还是什么都没有看到,确实我们也没有写具体的功能代码,接下来我们要做的就是在屏幕上显示“Hello World!”,首先知道一下要在屏幕上显示,首先需要一个UIWindow对象,这个你可以认为是一个电视机,然后还需要往这个UIWindow对象里添加UIView对象, UIView相当于电视上一幕一幕的画面。通过上面的流程知道要在程序后显示可以在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子类负责视图的显示控制,非常的好用,在这里我们只是实现了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 

到这里我们已经完成的Hello World程序的编写,点击运行就能看到如下的效果图:

效果图 

分享到:
评论

相关推荐

    ios_storyboard_helloworld实例

    通过这个简单的“ios_storyboard_helloworld”实例,你不仅学会了如何使用`Storyboard`创建基本的用户界面,还对Objective-C和iOS应用的基础架构有了初步的认识。这只是一个起点,随着学习的深入,你将能够创建更...

    ios的opencv的helloworld

    这篇博客“ios的opencv的helloworld”可能介绍了如何在iOS应用中引入OpenCV库,并实现一个简单的HelloWorld示例。OpenCV(开源计算机视觉库)是一个强大的工具,用于图像和视频分析、处理以及计算机视觉算法的实现。...

    笨鸟学iOS开发(1)HelloWorld源码

    本文将深入探讨“笨鸟学iOS开发(1)HelloWorld源码”这个主题,帮助初学者理解iOS应用程序的基础构建块。 首先,我们要知道iOS应用的基本架构是基于Cocoa Touch框架,它是由Objective-C或Swift编程语言实现的。在...

    iphone 开发入门例子 helloworld

    了解iOS应用的生命周期是开发中的关键环节。从启动到退出,应用会经历多个状态,如初始化、后台运行、暂停和终止。开发者需要理解这些状态,以便在适当的时候保存和恢复数据,以及优化性能。 八、UI设计 虽然"Hello...

    HelloWorld:iOS应用程序源代码的第一个存储库-Source code world

    "HelloWorld:iOS应用程序源代码的第一个存储库"是一个典型的初学者项目,用于介绍iOS应用开发的基础知识。这个存储库包含了iOS应用的源代码,帮助开发者了解如何在iOS平台上创建基本的应用程序。"系统开源"标签意味...

    iPhone开发【一】从HelloWorld开始

    在这个关于iPhone开发的系列教程的第一部分,我们将深入探讨如何创建你的第一个iOS应用,从"HelloWorld"开始。 首先,你需要安装Xcode,这是Apple官方提供的集成开发环境(IDE),用于开发iOS和macOS应用程序。...

    (1)--HelloWorld

    - **AppDelegate类**:这是应用程序的主要管理类,负责整个应用程序的生命周期管理。其中包括初始化、暂停、恢复等功能。 - **initInstance()**:此函数用于处理不同平台间的适配问题,确保应用程序能在不同设备...

    HelloWorld_iOS:iOS设备的Hello World源代码-Source code world

    在iOS开发中,应用程序的生命周期和用户界面的管理都围绕着`UIViewController`及其子类进行。`viewDidLoad`方法在视图控制器的视图被加载到内存时调用,是初始化界面的好时机。Swift的强类型特性确保了代码在编译...

    Hello_World.zip_Hello world.a_iphone hello wor_world

    7. **生命周期**:学习应用的生命周期,如viewDidLoad、viewWillAppear等方法。 8. **编译与构建**:理解编译过程和构建设置,如何生成可执行文件。 通过这个项目,新手开发者将迈出iOS编程的第一步,掌握基本的...

    apple程序生命周期

    程序生命周期涉及到从应用程序启动、运行、暂停、后台处理、恢复直至关闭的全过程。对于iPhone开发来说,掌握这个生命周期有助于编写更加高效和响应良好的应用。 首先,让我们回顾一下Objective-C中的协议...

    ipad helloworld demo

    首先,我们要明确的是,iPad应用开发是基于iOS SDK中的UIKit框架,这个框架提供了创建用户界面、处理用户输入和管理应用程序生命周期所需的所有工具。开发者通常使用Xcode IDE(Integrated Development Environment...

    ios-hello-world:iOS Hello世界

    这个过程中,你可以逐步了解Xcode的工作流程,Swift或Objective-C的基本语法,以及iOS应用的生命周期管理。这将是iOS开发之旅的起点,后续可以深入学习更高级的主题,如Core Data、Auto Layout、SwiftUI等。

    helloworld

    5. **App生命周期**:了解应用如何启动、运行、暂停、恢复和终止,以及如何妥善管理内存。 6. **Model-View-Controller (MVC)**:这是一种设计模式,将应用的业务逻辑(Model)、用户界面(View)和控制逻辑...

    只用代码不用xib写的helloworld

    UIKit是Apple为iOS设备提供的核心应用程序框架,它包含了创建用户界面、处理用户交互以及管理应用生命周期所需的所有组件。在这个项目中,我们不依赖XIB文件,而是直接使用代码来构建视图和控制器。 1. 创建项目:...

    IOS开发指南(第5版) pdf下载地址

    iOS应用的生命周期和状态管理是开发者必须理解的概念。书中会阐述如何处理应用的启动、暂停、恢复和终止,以及如何有效地管理内存和后台任务。此外,还会涉及到数据持久化,包括使用Core Data进行对象关系映射,以及...

    cocos2d 3.4新建helloworld工程的例子代码及文档说明

    1. `AppDelegate.cpp/h`: 应用的入口点,负责初始化Cocos2d引擎,处理应用生命周期中的事件。 2. `main.cpp`: C++程序的主入口,调用AppDelegate的初始化方法。 3. `HelloWorldScene.cpp/h`: 游戏场景的实现,这里...

    ios app 开发简介 ppt

    ios生命周期,消息流程,基本数据类型,objective-c基础,helloworld示例,uitableview

    IOS 入门开发之创建第一个应用程序

    6. **生命周期方法**:理解UIViewController的生命周期对于控制应用的行为至关重要。如`viewDidLoad()`,当视图控制器的视图被加载到内存时调用,是初始化UI的好地方。 7. **运行和调试**:在Xcode中,你可以直接在...

    UniApp HelloWorld程序入门必知

    在本项目中,"HelloWorld"是一个典型的起点,用于介绍如何创建和运行一个简单的 UniApp 应用。 【描述】"基础实战项目"暗示了我们将通过实际操作来学习 UniApp 的核心特性。这个项目可能会包括创建一个新的 UniApp ...

    ios开发详解markdown格式

    - **CoreData**:这是一个用于iOS和macOS的数据持久化框架,可以有效地管理对象的生命周期及其之间的关系。 - **CoreAnimation**:提供了一套强大的动画接口,让开发者可以轻松实现复杂的动画效果。 - **Grand ...

Global site tag (gtag.js) - Google Analytics