本文从头开始来构建一个Hello World应用程序。
首先在Xcode中新建一个Window-based Application(基于窗口的应用程序),当项目窗口打开时,删除HelloWorldAppDelegate.h、HelloWorldAppDelegate.m、MainWindow.xib,注意不要忘了打开HelloWorld-Info.plist,删除Main nib file base name这一行,保存。
打开main.m,代码清单及相应的注释如下:
#import <UIKit/UIKit.h>
@interface HelloWorldViewController :UIViewController
@end
@implementation HelloWorldViewController
//视图控制器收到加载其视图的请求,运行loadView方法
//以下是手动构建视图,意味着使用loadView方法设置主视图和它的子视图
- (void)loadView{
//首先创建一个新视图,让它填满应用程序的整个可用空间
UIView *contentView=[[UIViewalloc]initWithFrame:[[UIScreenmainScreen]applicationFrame]];
//设置背景颜色
contentView.backgroundColor=[UIColorlightGrayColor];
//构建UILabel的一个实例,设置其属性
UILabel *label=[[UILabelalloc]initWithFrame:CGRectMake(0.0f,0.0f,320.0f,30.0f)];
label.text=@"Hello World";
label.center=contentView.center;
label.textAlignment=UITextAlignmentCenter;
label.backgroundColor=[UIColorclearColor];
//将子视图添加到父视图中
[contentView addSubview:label];
//释放label内存
[label release];
self.view=contentView;
//释放contentView内存
[contentView release];
}
@end
@interface HelloWorldAppDelegate :NSObject<UIApplicationDelegate>
@end
@implementation HelloWorldAppDelegate
//应用程序已启动,调用此方法
- (void)applicationDidFinishLaunching:(UIApplication *)application{
//构建一个新窗口
UIWindow *window=[[UIWindowalloc]initWithFrame:[[UIScreenmainScreen]bounds]];
//创建自定义视图控制器的一个实例
HelloWorldViewController *hwvc;
hwvc=[[HelloWorldViewControlleralloc]init];
//将控制器的视图添加到窗口中,hwvc.view会请求加载视图
[window addSubview:hwvc.view];
[windowmakeKeyAndVisible];
}
@end
//应用程序从main函数开始执行
int main(int argc,char *argv[])
{
//首先建立自动释放池
NSAutoreleasePool *pool = [[NSAutoreleasePoolalloc]init];
//调用UIApplicationMain,将控制转交给应用程序委托,该委托由最后一个参数指定
int retVal =UIApplicationMain(argc, argv,nil,@"HelloWorldAppDelegate");
[pool release];
return retVal;
}
程序运行效果如下:

本程序虽然简单,但包含的知识不少,以下做个总结:
(1)每个iPhone应用程序都有一个UIApplication,UIApplication是iPhone应用程序的开始并且负责初始化并显示UIWindow,并负责加载应用程序的第一个UIView到UIWindow窗体中。UIApplication的另一个任务是帮助管理应用程序的生命周期,而UIApplication通过一个名字为UIApplicationDelegate的代理类来履行这个任务。尽管UIApplication会负责接收事件,而UIApplicationDelegate则决定应用程序如何去响应这些事件,UIApplicationDelegate可以处理的事件包括应用程序的生命周期事件(比如程序启动和关闭)、系统事件(比如来电、记事项警告)。
(2)main函数的核心是UIApplicationMain方法,其函数声明为:
UIKIT_EXTERNintUIApplicationMain(intargc,char*argv[],NSString*principalClassName,NSString*delegateClassName)
注意主函数的第三个以及第 四个参数,这两个参数指明了应用程序的主类和应用程序委托。而这个应用程序委托就是一个处理应用程序生命周期管理事件的类。如果指定是nil,则被告知需要从一个 nib文件来装入这些类对象。在Info.plist文件中,指定了一个nib文件,默认情况下是MainWindow.xib,接下来的事情就是 UIKit在xib文件中寻找应用程序的委托了。
iPhone应用程序都有一个窗口对象,应用程序委托中有两个连接,一个连接到该nib文件的窗口对象,一个连接到该nib文件的视图控制器上。一般我们可以通过定制视图控制器的行为来控制我们的显示。
整个过程就是:系统先调用main函数,然后main函数调用UIAplicationMain函数,这个函数利用Info.plist文件来寻 找应用程序的主nib文件,在该文件中找到应用程序的一个委托,这个委托又有两个连接,可以接连到一个窗口和视图控制器。然后这个视图控制器又可以定制我 们的显示行为(可以用代码定制也可以用nib文件定制),这就是启动应用程序的整个过程。
(3)loadView和viewDidLoad区别:
viewDidLoad此方法只有当view从nib文件初始化的时候才被调用。
loadView 此方法在控制器的view为nil的时候被调用。 此方法用于以编程的方式创建view的时候用到。 如:
-(void)loadView{
UIView *view =[[UIView alloc]initWithFrame:[UIScreenmainScreen].applicationFrame];
[view setBackgroundColor:_color];
self.view = view;
[view release];
}
你在控制器中实现了loadView方法,那么你可能会在应用运行的某个时候被内存管理控制调用。 如果设备内存不足的时候, view 控制器会收到didReceiveMemoryWarning的消息。 默认的实现是检查当前控制器的view是否在使用。 如果它的view不在当前正在使用的view hierarchy里面,且你的控制器实现了loadView方法,那么这个view将被release,loadView方法将被再次调用来创建一个新的view.
本文详细介绍如何从零开始在Xcode中构建一个简单的HelloWorld应用程序。文章涵盖了从项目创建到实现核心功能的过程,包括使用Objective-C编写视图控制器、设置视图、加载视图等关键步骤。
1215

被折叠的 条评论
为什么被折叠?



