您的位置:首页 > 其它

从HelloWorld看iphone程序的生命周期

2014-03-21 17:09 330 查看
做iphone开发首先第一件就是得知道iphone程序的生命周期,说白点就是当点击程序图标启动程序开始到退出程序整个使用运行过程中底下的代码都发生了什么,只有理解了这个才能游刃有余的掌握Iphone程序的开发。
用Xcode新建一个名为HelloWorld的Window-basedApplication类型的项目。

大体上讲一下项目的文件结构,由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已经给我们生成了一个很简单的项目模板。
1 UIApplication对象和UIApplication代理类对象
每一个iphone程序都包含一个UIApplication对象,它管理整个程序的生命周期,从加载第一个显示界面开始,并且监听系统事件、程序事件调度整个程序的执行。在项目中UIApplication对象是由UIApplicationMain方法初始化到内存中,首先打开OtherSources文件夹下的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对象设置代理类。
2现在开始编写我们的第一个iphone程序helloWorld。
要忘记代码模板,忘记xib忘记InterfcaeBuilder嘛,我们把模板自动生成的以下文件删除:
OtherSources文件下main.m
Classes文件夹下的HelloWorldAppdelegate.h和HelloWorldAppdelegate.m
Resources文件夹下的MainWindow.xib

然后打开Resources文件夹下HelloWorld-info.plist,然后找到key为“Mainnib file basename”删除,因为在上面我们已经删除了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”);这样做我们为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*)applicationwillChangeStatusBarFrame:(CGRect)newStatusBarFrame{}

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

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

return YES;

}

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

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

@end

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



补充:

到这为止我们的这个程序运行起来还是什么都没有看到,确实我们也没有写具体的功能代码,接下来我们要做的就是在屏幕上显示“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];

}

上面的代码中做了如下几件事情:

1、 实例化了一个UIWindow对象

2、 实例化了SampleViewController对象

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

4、 显示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.286falpha:1.0f];

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

[contentView addSubview:frontLabel];

[frontLabel release];

}

@end

到这里我们已经完成的HelloWorld程序的编写,点击运行
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: