免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 779 | 回复: 0
打印 上一主题 下一主题

【IOS】iPhone ! Hello world ! --iPhone 开发入门工程代码解析 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-01-17 15:04 |只看该作者 |倒序浏览
今天偶来说说iphone的helloworld。

首先从官网上下载源码包,解压后结构如下:
.
│  Background.png
│  Default.png
│  HelloWorld.xib
│  HelloWorld_Prefix.pch
│  Icon.png
│  Info.plist
│  main.m
│  MainWindow.xib
│  ReadMe.txt
│ 
├─Classes
│      HelloWorldAppDelegate.h
│      HelloWorldAppDelegate.m
│      MyViewController.h
│      MyViewController.m
│     
└─HelloWorld.xcodeproj
        project.pbxproj

猛一看,真是非常的复杂,慢慢来,下面我来解释一下。
首先看最外层,包含了2个目录和一堆闲散文件。
Classes目录顾名思义,存放了项目的各个类,是需要开发者进行改动的。这里相当于symbian工程的inc和src目录。
HelloWorld.xcodeproj:看上去是个目录,其实在mac上,这个是XCode的项目文件,存放了在XCode中,项目的组成和 build等信息。如果在XCode中打开这个工程,还会再生成2个文件,一般来说我们不用理会。
闲散文件:
1,几个png:用于程序的背景和图标等。
2,pch:预编译头文件,win32里经常会碰到,这里也有,包含了常用的头文件。
3,plist:包含了项目自身的特性,比如说项目名称啊,默认加载的nib file啊等等等等。相当于symbian中的mmp文件。
4,两个xib:这就是传说中的资源文件。和现在流行的GUI程序一样,iphone中也提供资源文件,用于简化编码过程,提高开发效率。
5,main.m:为什么这里单放了一个源文件呢,其实这个main.m是完全不用动的,大家马上就会看到这里面到底有什么。

---
开始进入source:
首先就是iphone程序的入口,在main.m中。
int main(int argc, char *argv[])
{
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    int retVal = UIApplicationMain(argc, argv, nil, nil);
    [pool release];
    return retVal;
}
这是大家都熟悉的main函数,里面马上创建一个NSAutoreleasePool对象,用于iphone高级架构的内存管理,然后全权委托 UIApplicationMain这个函数来处理整个过程。
UIApplicationMain中封装了具体的做法,在适当的时候,会调用适当的方法,形成一个事件驱动的过程。
和UIApplicationMain最为紧密的,就是 UIApplicationDelegate,UIApplicationDelegate提供了对app生命周期关键时刻的处理。
在这里,极为简单地,在iphone OS准备好运行这个app后,会发送消息给UIApplicationDelegate的applicationDidFinishLaunching方法,表示程序开始run,我们的具体实现当然是初始化一切啦。

上代码:

- (void)applicationDidFinishLaunching:(UIApplication *)application {
   
    // Set up the view controller
    MyViewController *aViewController = [[MyViewController alloc] initWithNibName:@"HelloWorld" bundle:[NSBundle mainBundle]];
    self.myViewController = aViewController;
    [aViewController release];
   
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackOpaque];
   
    // Add the view controller's view as a subview of the window
    UIView *controllersView = [myViewController view];
    [window addSubview:controllersView];
    [window makeKeyAndVisible];
}

一开始,我们建立起view controller,这里是读取一个名叫@"HelloWorld",并且处于mainBundle中的nib file。
之后设置一下状态栏(可有可无的),接下来,给window加一个UIView,这个UIView在controller中可以取到。最后让这个 window "makeKeyAndVisible",显示窗口,并接受用户的输入。

最关键的已经说完,接下来一起看看view controller的细节,由于是helloworld,我就不把功能当成重点了,大家有可以去查查sdk。
先看看controller的声明的一部分,注意这只是一部分:

@interface MyViewController : UIViewController <UITextFieldDelegate> {
   
    IBOutlet UITextField *textField;
    IBOutlet UILabel *label;
    NSString *string;
}

这里我们的controller继承自iphone规定的controller的基类——UIViewController ,并实现了UITextFieldDelegate这个Delegate(相当于c++的纯虚函数;java中的接口)。 UITextFieldDelegate只是用来实现输入框的增强型功能的,可有可无。
下面有3个成员变量,textField是系统输入框控件,label是系统label控件,string是文字。注意前两个成员的声明之前,出现了IBOutlet,这是用来通知interface builder的,用于把代码中的实例和nib file中的定义关联起来。

在MyViewController.m中,override了几个来自于基类的方法,有viewDidLoad和touchesBegan。
viewDidLoad来自于UIViewController,是一个回调。 touchesBegan来自于UIResponder,当触摸开始时(手指头向下按的时刻),由系统回调回来。

ok,代码部分已经全部说完,因为是helloworld,回调并不太多也并不太全,稍稍有些不严谨,不过这不影响我们学习。

---
其他的一些重要文件:
1,HelloWorld.xib:可以直接打开,这是个xml。数据量虽然不小,但我们根本不需要直接改。 interface builder就是用来修改这个文件的。文件内记录了位置、引用、字符串等等信息。
2,Info.plist:这也是个xml,记录了app的重要特性。这里基本就要自己手动改了,在 plist节点中,仅有一个dict子节点。dict节点中定义了若干个key,随便说几个:CFBundleDevelopmentRegion(开发者所在地区),CFBundleDisplayName,CFBundleExecutable,NSMainNibFile等。
但说一下NSMainNibFile,它定义了入口的nib file,这个工程定义的是MainWindow.xib,提供了window。

---
最后的话:
如果大家看到这里还没晕,那么说明你们是牛,这点东西为难不了你们~~
如果大家觉得很多东西难以理解,那么,找个机会,在iphone的模拟器上跑一圈吧~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP