apple程序生命周期
iphone程序的生命周期分析 做iphone开发首先第一件就是得知道iphone程序的生命周期,说白点就是当点击程序图标启动程序开始到退出程序整个使用运行过程中底下的代码都发生了什么,只有理解了这个才能游刃有余的掌握Iphone程序的开发,否则在写程序的时候有点浑浑僵僵不知所以然的感觉。首先忘记Xcode给我们生成的代码模板,忘记xib忘记ib,我们亲自一行一行来写一个HelloWorld程序,虽然真正开发项目的时候并不需要这样做Xcode模板和ib都会为我们做好这些打杂的事情,但是现在完全由我们自己来写,放心这个程序是个非常的简单的HelloWorld 程序,代码也很少总共加起来不过10几行。
在这之前我们先来看看object-c语言的关于这段协议代码:
@protocol SimpleProtocol
-(void)doSomething:(NSString *)str;
@end
@interface SimpleClass:NSObject< SimpleProtocol >{
}
@end
@implementation SimpleClass
-(void) doSomething:(NSString *)str{
NSLog(str);
}
@end
这样是一个简单的协议示例,类SimpleClasss实现了名为SimpleProtocol的协议。协议在其它语言里跟接口非常类似,记住这个协议的实现,接下来会有用的。
接下来用Xcode新建一个名为HelloWorld的Window-based Application类型的项目。大体上讲一下项目的文件结构,由Xcode模板生成的项目主要包含Classes(HelloWorldAppdelegate.h和HelloWorldAppdelegate.m)、Other Sources(main.m和HelloWorld_Prefix.pch)、Resources(MainWindow.xib和HelloWorld-info.plist)、Frameworks(iphoneSDK提供的系统框架)、Products(HelloWorld.app)这几部分。直接运行这个工程会在模拟器里看到一个白色的显示界面程序,由此可见没写一行代码Xcode已经给我们生成了一个很简单的项目模板。
每一个iphone程序都包含一个UIApplication对象,它管理整个程序的生命周期,从加载第一个显示界面开始,并且监听系统事件、程序事件调度整个程序的执行。那么上面这个简单项目中的UIApplication对象在哪呢?在这个项目中我们找不到任何关于UIApplication的代码,其实在项目中UIApplication对象是由UIApplicationMain方法初始化到内存中,首先打开Other Sources文件夹下的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函数中第二行代码UIApplicationMain(argc, argv, nil, nil);对UIApplication对象进行了初始化,这个方法除了argc 和 argv 参数外,另外这个函数还有2个两个字符串参数来识别UIApplication类和UIApplication代理类,在这里默认是2个nil,第一个参数为nil就默认把UIApplication类作为缺省值进行初始化,可以在这里不填nil而是使用自己定义的UIApplication子类。至于第二个参数nil就设置为nil就把模板生成的HelloWorldAppdelegate类作为默认值。这里有了UIApplication对象怎么又出来一个UIApplication代理类对象呢?这里需要说明UIApplication对象说是管理整个程序的生命周期其实它是什么具体的事情都不干,它只负责监听事件当需要做实际工作的时候就交给UIApplication代理类去做,UIApplication相当于传令官负责只把命令传达给UIApplication代理类这个士兵,然后由这个士兵真正去冲锋陷阵,所以需要给UIApplication对象设置代理类。
非常不好意思写了一堆罗嗦的文字还没有进入正题,不过这些罗嗦还是非常有必要的,现在开始编写我们的第一个iphone程序helloWorld。上面不是说了要忘记代码模板,忘记xib忘记Interfcae Builder嘛,这样我们把模板自动生成的部分删除了,找到Other Sources文件下main.m删除,找到Classes文件夹下的HelloWorldAppdelegate.h和HelloWorldAppdelegate.m删除,把Resources文件夹下的MainWindow.xib删除,还有一件事情一定要做那就是打开Resources文件夹下HelloWorld-info.plist,然后找到key为“Main nib file base name”删除因为在上面我们已经删除了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;
}
NSAutoreleasePool内存自动释放池这个干什么我就不说了,你懂得的。这里主要看一下第二行UIApplicationMain(argc, argv, nil, nil);与模板生成的相比改成UIApplicationMain(argc, argv, nil, @”SampleDelegate”);这样做我们为UIApplication对象设置了名为SampleDelegate代理类,上面不是说了UIApplication是不处理具体事情的,真正做事的是UIApplication代理类,这个名为SampleDelegate代理类就是我们需要具体写代码实现的,当UIApplication初始化后就开始监听事件,根据不同的监听事件让SampleDelegate代理类做不同的处理,比如显示第一个显示界面。
新建名为SampleDelegate.m的类,在SampleDelegate.h输入如下代码:
@interface SampleDelegate : NSObject<UIApplicationDelegate> {
}
@end
注意到没有,SampleDelegate: NSObject <UIApplicationDelegate>这个写法是不是很眼熟 ,在看看最上面那段object-c语言的关于协议代码,SimpleClass类需要实现SimpleProtocol协议定义的方法,这样看来UIApplicationDelegate是一个协议定义,同样SampleDelegate也需要实现UIApplicationDelegate中定义的方法,只是这个协议是系统定义好的(具体可以参看UIApplicationDelegate.h)而SimpleProtocol是我们自己定义的,但是要做的事情相同,就是SampleDelegate需要去实现这UIApplicationDelegate协议定义好的方法, 这些方法就是UIApplication对象监听到系统变化的时候通知UIApplication对象代理类SampleDelegate执行的相应方法。下面是SampleDelegate的实现代码写在SampleDelegate.m中
注意到没有,SampleDelegate: NSObject <UIApplicationDelegate>这个写法是不是很眼熟 ,在看看最上面那段object-c语言的关于协议代码,SimpleClass类需要实现SimpleProtocol协议定义的方法,这样看来UIApplicationDelegate是一个协议定义,同样SampleDelegate也需要实现UIApplicationDelegate中定义的方法,只是这个协议是系统定义好的(具体可以参看UIApplicationDelegate.h)而SimpleProtocol是我们自己定义的,但是要做的事情相同,就是SampleDelegate需要去实现这UIApplicationDelegate协议定义好的方法, 这些方法就是UIApplication对象监听到系统变化的时候通知UIApplication对象代理类SampleDelegate执行的相应方法。下面是SampleDelegate的实现代码写在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)newStatusBarOrientation duration:(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
现在来看协议中定义的这些需要实现的方法分别是什么作用:
、- (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:
(UIInterfaceOrientation)newStatusBarOrientation
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方法如下:
- (void)applicationDidFinishLaunching:(UIApplication*)application{
UIWindow *window=[[UIWindow alloc]initWithFrame:[[UIScreen mainScreen] bounds]];
SampleViewController *viewctrl=[[SampleViewController alloc]init];
[window addSubview:viewctrl.view];
[window makeKeyAndVisible];
}
上面的代码中做了如下几件事情:
<!--[if !supportLists]-->、 <!--[endif]-->实例化了一个UIWindow对象
<!--[if !supportLists]-->、 <!--[endif]-->实例化了SampleViewController对象
<!--[if !supportLists]-->、 <!--[endif]-->把SampleViewController对象UIView对象添加到UIWindow对象中
<!--[if !supportLists]-->、 <!--[endif]-->显示UIWindow对象
看这段代码我们并没有直接实例化一个UIView对象然后添加给UIWindow对象而且通过SampleViewController对象,它是UIViewController子类负责视图的显示控制,非常的好用,在这里我们只是实现了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];
[contentView addSubview:frontLabel];
[frontLabel release];
}
@end
到这里我们已经完成的HelloWorld程序的编写,点击运行就能看到如下的效果图:
apple程序生命周期的更多相关文章
- (转)iOS应用程序生命周期(前后台切换,应用的各种状态)详解
原文:http://blog.csdn.net/totogo2010/article/details/8048652 iOS应用程序生命周期(前后台切换,应用的各种状态)详解 分类: ...
- 转:iOS应用程序生命周期(前后台切换,应用的各种状态)详解
iOS应用程序生命周期(前后台切换,应用的各种状态)详解 分类: iOS开发进阶2012-10-08 15:35 42691人阅读 评论(30) 收藏 举报 iosapplication任务anima ...
- C# MVC 5 - 生命周期(应用程序生命周期&请求生命周期)
本文是根据网上的文章总结的. 1.介绍 本文讨论ASP.Net MVC框架MVC的请求生命周期. MVC有两个生命周期,一为应用程序生命周期,二为请求生命周期. 2.应用程序生命周期 应用程序生命周期 ...
- [转]ASP.NET应用程序生命周期趣谈(五) IIS7瞎说
Ps:建议初学者在阅读本文之前,先简要了解一下之前的几篇文章,以便于熟悉本文提到的一些关于IIS6的内容,方便理解.仅供参考. PS:为什么叫瞎说呢?我觉得自己理解的并不到位,只能是作为一个传声筒,希 ...
- [转]ASP.NET应用程序生命周期趣谈(三) HttpModule
在之前的文章中,我们提到过P_Module(HttpModule)这个能干的程序员哥们儿,它通过在项目经理HttpApplication那里得到的授权,插手整个应用程序级别的事件处理.所有的HttpM ...
- [转]ASP.NET应用程序生命周期趣谈(一)
这几天一直在看ASP.NET应用程序生命周期,真是太难了,我理解起来费了劲了,但偏偏它又是那么重要,所以我希望能给大家带来一篇容易理解又好用的文章来帮助学习ASP.NET应用程序生命周期.这篇就是了. ...
- 图解ios程序生命周期
图解ios程序生命周期 应用程序启动后状态有Active.Inactive.Background.Suspended.Not running这5种状态,几种状态的转换见下图: 在AppDelegate ...
- asp.net应用程序生命周期和asp.net网页的生命周期
一.asp.net应用程序生命周期 asp.net应用程序生命周期以浏览器向web服务器(比如IIS服务器)发送请求为起点,先后经历web服务器下的ISAPI(Internet Server Appl ...
- asp.net应用程序生命周期
asp.net应用程序生命周期(流程文字描述版) 请求——>IIS——>ISAPI映射——>交给asp.net(即为IIS的扩展)——>通知Application类创建一个应用 ...
随机推荐
- NET基础课--XML基础
id level是属性,title为子节点 接下来操作子节点 比较xml的处理方式: 1和3适合数据量小的时候.
- javascript模式——Decorator
Decorator 模式是一种结构型模式,他意在促进代码的复用,是塑造子类的一个方式. 这种想法是基于,新增的属性,对于对象来说不是必须的基本功能.我们为特殊的对象添加自己的方法,而不是重新创建一个类 ...
- .NET 下成熟开源的BPM产品四款推荐
.net下的BPM产品相比JAVA的确实不多,这里主要提4款. 1.博客园.github.codeplex上的开源的流程组件AppInOne BPM,目前已有不少的企业开始使用. 优点:产品框架较全面 ...
- linq读书笔记2-查询内存中的对象
上次我们说到了linq对数组内容的检索,自.net2.0以后,泛型成了很常见的一种应用技术,linq对泛型的检索也提供了完善的支持 如对list类型的支持,范例如下: class Program ...
- iframe 重新加载闪过白块问题
在使用iframe时,iframe背景为白块,刷新时也会闪过白块.如果刷新时间长,就会一直出现白块,让人很烦恼,通过网上搜资料,测试最终解决方法如下所示,注意主要针对IE浏览器测试. 一.iframe ...
- JSP 基础之 JSTL <c:forEach>用法
在JSP的开发中,迭代是经常要使用到的操作.例如,逐行的显示查询的结果等.在早期的JSP中,通常使用Scriptlets来实现Iterator或者Enumeration对象的迭代输出.现在,通过JST ...
- R - 一只小蜜蜂...(第二季水)
Description 有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行.请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数. 其中,蜂房的结构如下所示. ...
- 从汇编看c++多重继承中this指针的变化
先来看一下下面的c++源码: #include <iostream> using namespace std; class X { public: virtual void print1( ...
- git基础命令
git pull 更新git status 查看文件状态git add .添加所有git commit -a -m "xxxx" 提交git push 推送至服务器git dif ...
- 【ecos学习4】[转]ubuntu 11.04 tftp 设置
安装 TFTP 服务 sudo apt-get install xinetdsudo apt-get install tftp-hpasudo apt-get install tftpd-hpa 修改 ...