开发一个iPhone Application的过程可以分为以下几个主要的步骤:
1.创建你的Project
2.设计用户界面
3.编写代码
4.构建和运行你的Application
5.调节你的Application的效能
1.创建一个iPhone Project
Xcode提供了一些iPhone-application project的模板让你可以很方便的开发你的应 用。你可以选择以下几种:
∙Navigation-BasedApplication 类似于地址薄那样的分层数据,多屏幕界面的应用
∙OpenGLESApplication 基于OpenGL ES视图,能够提供图片和动画功能的应用
∙TabBarApplication 类似于时钟,可以在各自页面提供可供用户选择设置界面的应用
∙View-BasedApplication 用一个单独的试图做为用户界面的应用
∙UtilityApplication 类似于Stocks,提供一个主页面和一个翻转的简单设置页面
∙Window-BasedApplication 一个简单的框架,包含一个application delegate 和 一个window,可以用来实现你自己的多层试图
如果你需要添加一个静态库到你的iPhone application中去的话,你可以选择Project->New Target,然后选择Stratic Library到iPhone OS/Cocoa Touch list中。
在iPhone中使用Static Librariy不需要code signed,因此,你需要做一下设置以在你创建的static library targets中移除Code Signing Identity的设置。
∙打开static library的Info窗口,选择Build面板
∙找到Code Signing分类中,在Code Signing Identity下选择Any iPhone OS Device这一项
∙改变Any iPhone OS Device的值为Don’t Code Sign
开发iPhone application,你的大部分工作都在project window中完成,下面的截图展示了一个project window
2.编写代码
编写代码最主要的工具是Xode的text editor,这个text editor几个常用的特性功能如下:
∙头文件定位:Command+双击一个常量、变量、对象或者函数名,就可以在新打开的窗口中跳到定义它们的位置
∙API参考定位:Option+双击一个符号名,能够跳到API reference中关于它的用法
∙代码折叠功能
∙代码自动完成
3.构建和运行你的Application
运行iPhone Application通过iPhone Simulator来完成。
对于编译或者调试,Xcode依赖一些开源工具来完成,比如GCC和GDB。Xcode同样支持使用版本控制的团队开发,比如Subversion,CVS等。
4.调节你的Application的性能
在Xcode下调试好你的Application后,你还需要确定你的Application能很好的运行在硬件设备上,比如内存资源在iPhone上是一个稀缺的资源,所以你的Application必须将内存的消耗减少到最小,又或者你的Application还得考虑到电池消耗等等问题,Xcode提供了两个工具来调节你的Application的性能,Instruments和Shark。详情请看后面的“调节Application的性能“一节。
(二)第一个iPhone程序“Hello World”
指南:Hello,World!
这个小节指引你创建一个简单的Project在iPhone的屏幕上显示文字。
创建项目:
1.运行Xcode
2.选择File > New Project
3.选择Window-Based Application模板,选择Choose
4.输入项目名HelloWorld并选择保存位置
5.添加MyView class 到project中
∙选择File > New File.
∙选择Cocoa Touch Class 下面的UIView subclass并单击Next
∙先Name输入框中输入”MyView.m”
∙选择“Also create “MyView.h””选项并单击完成
6.选择合适的SDK激活
Project > SetActive SDK下可以进行相应的设置
编写代码
在Xcode中,Text Editor将会占用你大部分的时间,你可以通过它编写,构建你的Application,调式你的代码。让我们来看看Xcode是怎样帮助我们完成第一个任务的。
首先,修改”HelloWorldAppDelegate”class,让它能够使用MyView这个class
1.
1.在Groups&Files列表中,选择HelloWorld组
2.在Detail视图中,双击HelloWorldAppDelegate.m
3.在弹出的HelloWorldAppDelegate.m编辑器窗口中
▪添加导入MyView.h的代码
#import “MyView.h”
▪在 applicationDidFinishLaunching:中Override point注释一行下面添加如下代码
MyView *view = [[MyView alloc] initWithFrame:[window frame]];
[window addSubview:view];
[view release];
4.修改MyView.m中的drawRect:方法来在view中输出文字.完成后的drawRect:方法应该是这样的
- (void)drawRect:(CGRect)rect {
// Drawing code
NSString *hello = @”Helloo,World!”;
CGPoint location = CGPointMake(10, 20);
UIFont *font = [UIFont systemFontOfSize:24];
[[UIColor whiteColor] set];
[hello drawAtPoint:location withFont:font];
}
运行你的程序
单击Build and Go或者选择Build 菜单下的Build and Run运行你的程序,你会看到弹出一个iphone模拟器,选择屏幕上的hello world,就会看到熟悉的“hello world”。
运行你的Application
当你做好准备调试你的application,你首先是通过Xcode的Build来构建你的系统,如果Build没有错误的话,你有两种方式可以运行你的Application:iPhone Simulator和Device
iPhone SDK包括了两个SDK系列:iPhone Simulator SDK和iPhone Device SDK。
iPhone Simlulator SDK:通过此SDK来Build的application运行在iPhone Simulator下。
iPhone Device SDK:通过次SDK来Build的application运行在Device下。
下面几个步骤是你运行你的Application需要做的:
1.设置application的目标iPhone OS版本
2.设置Active SDK
3.设置使用的Build配置
4.Build你的application
5.运行你的application
下面的文字稍微详细点的描述了以上几个步骤。
∙设置application的目标iPhone OS版本
每一个发布的iPhone OS(包括与其相对应的iPhone SDK)都包括了它以前的版本所不提供或支持的一些特性。当一个新的iPhone OS发布的时候,有的用户会直接升级到最新的版本,而另外的用户会在等待一段时间之后才会升级到最新的版本。你可以根据你的application的需要和你的用户的情况选择下面两个策略中的一个:
∙以最新的iPhone OS为目标发布。意味着你可以使用最新的iPhone OS版本的一些特性和优点,但也许这样做也很接近只能让很少一部分用户能在他们的设备上安装你的application,因为你的application并不能运行在他们那些没有升级到最新版本iPhone OS的设备上。
∙以以前的iPhone OS为目标发布。这样做能让你所发布的application有一个比较大的用户基数,因为这样发布的application不光能运行在最新版本的OS的设备上,也能运行在以前稍早的OS版本的设备上,但是这样做的缺点在于你将不能使用最新版本的iPhone OS所提供的一些最新的特性和优点。
你可以在你的project的info窗口中General一项中的Base SDK for ALL Configurations这一栏弹出的菜单中设置的你默认的目标iPhone OS版本。
你还可以在project的info窗口的Build一项中的Deployment的iPhone OS Deployment Target一项中选择不同的设置来针对不同的Build配置(比如发布或者调试),这里的设置会覆盖基本的SDK设置。
当你Build你的application后,你的目标iPhone OS 版本会在Info.plist文件中的MinimimOSVersion的内容中反应出来。
当你的application发布到App Store之后会根据MiniminOSVersion的属性来判断你的application是针对哪个版本的iPhone OS发布的。
∙设置Active SDK
Active SDK的设置告诉Xcode下次你运行Build命令的时候用哪个SDK来Build你的application和选择是运行在iPhone Simlulator还是Device上。
下面两个地方可以设置Active SDK:
∙Project菜单的Set Active SDK子菜单中
∙在项目窗口中的工具栏上的Overview弹出菜单中
当你在iPhone Simulator中调试好你的application之后,你还必须在一个基于iPhone OS的Device上调节你的application,以取得在实际应用中较好的性能,但你必须成为官方认证的iPhone Developer Program成员,详细情况会在后面的文章中专门说明。
当你active SDK的设置从iPhone Simlulator改为iPhone Device SDK时,你需要注意的是二者虽然都是基于Mac OS的,但是一些framework会在不同的环境中存在差异,比如ApplicationServices framework。
如果你的代码直接导入了iPhone Simulator SDK的头文件──在 ∙设置使用的Build配置 当你开始一个build你的application的过程的时候,Xcode通过active build configuration来build你的application,你可以通过下面两个方法来设置你的active build configuration: ∙在Project菜单现面的Set Active Build Configuration子菜单中 ∙在 在项目窗口中的工具栏上的Overview弹出菜单中 ∙Build你的application 如果要开始Build你的application,选择Build菜单下的Build项。 状态栏会显示Build成功或者出现的错误及警告。你可以在文本编辑器或者project窗口中浏览错误及警告的信息。 基于iPhone OS的device支持ARM和Thumb两种指令集。Xcode使用Thumb做为默认的指令集,因为使用Thumb相对于ARM能够显著的减少35%的代码量。但如果你的application广泛的应用到了浮点运算的代码的话ARM也许能带来比Thumb更好的性能。 你可能遇到的一个比较常见的build错误是由于application ID的冲突引起的错误。冲突来自于你提供的profile(通过程序入口取得的)和你的application的CFBundleIdentifier属性定义的ID的不同。为了避免这个错误,请确保你的profile中的application ID(App ID)设置成com. ∙运行你的application 当你运行你的application时,Xcode会把它安装到iPhone Simulator或者device(由acitve SDK决定)并运行它。 如果你有多个device连接到你的计算机上,你可以指定谁来安装并运行这个application,通过Project > Set Active Executable菜单来设置。 运行你的application,选择Run > Run 或者 Run > Debug。 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 首先从官网上下载源码包,解压后结构如下: . │ HelloWorld.xib │ HelloWorld_Prefix.pch │ 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 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。 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 从头教你不用IB写漂亮的程序 图片: 图片: 图片: 图片: 图片: 图片: 图片: 没有 nib 的 iphone 程序 Interface Builder 开始用还觉得酷炫浮华,越用越觉得不对劲,对于刚开始学写 iphone 程序,没有帮助理解代码,反而隐藏了需要知道的内容,然后用线连啊连,连着连着就晕了。另外,重点是,牛人都直接用代码写 GUI 的啊 XD。刚才试了一下不用 nib,只用敲 code,真的可以耶。步骤如下: 1. 新建一个 Window-Based Application 项目 2. 删掉 MainWindow.xib 文件 3. 删掉 Info.plist 里面的 Main nib file base name 属性 4. 把 main.m 文件中的 UIApplicationMain 函数最后一个参数由 nil 改为 @"NiblessHelloWorldAppDelegate" 也就是我们的主要 delegate 的类名字 5. 把 NiblessHelloWorldAppAppDelegate.h 文件里的 IBOutlet 声明删掉(不删也行) 6. 在 NiblessHelloWorldAppDelegate.m 的程序启动回掉函数里加上我们自己创建 window 以及 view 的代码 7. Build And Go Go Go。。 /////////////////////////////////////////////////////////////////// 首先注明一下,如果你还不能熟练使用Interface Builder,请最好不要阅读这篇文章。你最好把Interface Builder烂熟于心,才开始走上这条“不归路”比较好。 其次,我说一下为什么要抛开Interface Builder做开发,原因主要是: [1] 更容易做多语言版本。虽然Xib文件是可以多语言化的,不过你重新去建立一些窗口,很麻烦的。 [2] Xib启动需要时间比用代码直接写慢,这个在iPhone上还是有感觉的。特别提示一点,如果自定义UITableViewCell,Cell数量大概6-7个,这个时间你几乎不能忍。 [3] Xib文件比代码建立UI文件大,如果要多语言就更是如此。 因为[1]的存在,可以说,不用Interface Builder做开发,是很有必要的。 Step 1 启动XCode,建立一个Window-base Application项目,这里假设项目名称是NoIBSample Step 2 在Resource Group下面删除MainWindow.xib Step 3 选择NoIBSample-Info.plist,然后在右边框里删除Main nib file base name那一行。 Step 4 去掉关键字IBOutlet 打开NoIBSampleAppDelegate.h,然后去掉@property (nonatomic, retain) IBOutlet UIWindow *window;中的IBOutlet Step 5 让main函数找到NoIBSampleAppDelegate 打开main.m,然后修改下面这行代码: int retVal = UIApplicationMain(argc, argv, nil, nil); 改成: int retVal = UIApplicationMain(argc, argv, nil, @"NoIBSampleAppDelegate"); 别忘了,在文件最开始加上#import "NoIBSampleAppDelegate.h" 好了,你可以在Simulator里面运行一下,应该是个黑屏。这很正常,因为我们没有创建任何Window和View。接下来,我们创键一个默认的View Step 6 打开NoIBSampleAppDelegate.m,修改函数 C代码 1.- (void)applicationDidFinishLaunching:(UIApplication *)application { 2. CGRect bounds = [[UIScreen mainScreen]bounds]; 3. window = [[UIWindow alloc]initWithFrame:bounds]; 4. CGRect frame = [[UIScreen mainScreen]applicationFrame]; 5. UIView *totalView = [[UIView alloc]initWithFrame:frame]; 6. totalView.backgroundColor = [UIColor whiteColor]; 7. totalView.alpha = 1.0f; 8. [window addSubview:totalView]; 9. [totalView release]; 10. // Override point for customization after application launch 11. [window makeKeyAndVisible]; 12.} - (void)applicationDidFinishLaunching:(UIApplication *)application { CGRect bounds = [[UIScreen mainScreen]bounds]; window = [[UIWindow alloc]initWithFrame:bounds]; CGRect frame = [[UIScreen mainScreen]applicationFrame]; UIView *totalView = [[UIView alloc]initWithFrame:frame]; totalView.backgroundColor = [UIColor whiteColor]; totalView.alpha = 1.0f; [window addSubview:totalView]; [totalView release]; // Override point for customization after application launch [window makeKeyAndVisible]; } 好了,再运行一下就可以看到白色背景了。可以下载源代码NoIBSample.tar.bz2看一下:)