不用Interface Builder实现的Hello World应用程序

本文详细介绍如何从零开始在Xcode中构建一个简单的HelloWorld应用程序。文章涵盖了从项目创建到实现核心功能的过程,包括使用Objective-C编写视图控制器、设置视图、加载视图等关键步骤。

本文从头开始来构建一个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应用程序都有一个UIApplicationUIApplicationiPhone应用程序的开始并且负责初始化并显示UIWindow,并负责加载应用程序的第一个UIViewUIWindow窗体中。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此方法只有当viewnib文件初始化的时候才被调用。

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.


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值