Objective-C2.0withCocoaFoundation文章来自:前言1,前言相信iPhone不久就要在国内发布了,和我们在国内可以通过正规渠道买得到的iPodTouch一样,iPhone也是一个激动人心的产品。iPhone发布的同时,基于iPhone的程序也像雨后春笋一样在iTunes里面冒出来。你将来也许会考虑买一个iPhone,体验一下苹果的富有创意的种种应用;你也许会考虑向iTunes的社区的全世界的人们展示一下你非凡的创意,当然也可以通过你的创意得到一些意想不到的收益。OK,你也许迫不及待的准备开发了。但是先等一下,让我们回忆一下最初的电影是怎么拍摄的。这个很重要,因为和iPhone的开发比较类似。在最初因为器材比较原始,所以拍摄电影需要很高的技术,那个时候的电影的导演基本上是可以熟练操作摄影器材的人。随着器材的完善,使用也简单起来。于是器材的使用不是决定一个电影的质量的唯一的因素,取而代之的是故事或者说电影的创意。iPhone的开发也是这样。当然从入门到掌握的过程来说任何事情都是开始比较难,随着掌握的程度的加深,你将会觉得开发iPhone应用程序是一件简单而且轻松的事情,到了那个时候,你的主要的制胜武器就不是开发技术,而是你的创意了。对于你来说,我在这里写的东西都是有关“摄影器材”也就是介绍如何使用iPhone的平台来开发应用程序。iPhone的开发语言是Objective-C。Objective-C是进行iPhone开发的主要语言,掌握了Objective-C的基本语法以及数据结构之后,你需要熟悉一下iPhone的SDK。笔者很难做到在一篇文章里面把所有的东西都介绍清楚,所以笔者打算分成两个主题,一个是Objective-C,一个是iPhone开发。本系列将侧重于Objective-C。当然,任何一种开发语言都无法脱离于运行环境,Objective-C也不例外。所以在本系列当中也会穿插的介绍一些SDK里面的一些特性,主要是数据结构方面,比如说NSString,NSArray等等。看到NSString,NSArray这些名词,你也许会感到有些茫然,不过没有关系,随着本系列的深入介绍,你会发现你非常喜欢这些东西。1.1,谁会考虑阅读本系列如果你对iPhone感兴趣,如果你考虑向全世界的人们展示你的创意,如果你有一颗好奇心,如果你打算通过开发iPhone程序谋生,如果你觉得苹果比Windows酷,如果你认为不懂苹果的话那么就有些不时尚的话,那么可以考虑阅读本系列。老手也可以考虑花一点时间阅读一下,可以发帖子和笔者交流切磋。笔者发布的文章属于公益写作,旨在为大家介绍iPhone开发的一些基础知识,如果可以提供宝贵意见,笔者将不胜感激。1.2,需要准备的东西公欲善其事,必先利其器。《论语·魏灵公》第一,你需要一台苹果电脑。当然这个不是必需的条件,如果你可以在你的IntelPC上成功安装MACOS的话,那么请忽略这一条。第二,你需要去苹果网站上下载开发工具XCODE。注意,XCODE是完全免费的,但是需要你去注册一个账号才可以下载。由于XCODE不时的在更新,所以如果你的MACOS不支持你下载的XCODE的话,那么你也许需要考虑买一个最新的MACOS。第三,你需要至少有C,C++,或者JAVA的背景知识。不过如果你没有,那么也不用担心,相信阅读了笔者的文章之后应该也可以掌握。最后需要的东西就不是必须的了,当然有的话会更好一些。这些东西是,开发者账户(需要付费),iPhone手机(在部分国家可以免费获得,但是中国会怎么样,笔者不是很清楚),iPodTouch(需要购买)。1.3,关于笔者的写作笔者利用业余时间进行写作,所以无法对文章发布的时间表做出任何保证,还请各位读者谅解。但是笔者会尽最大努力在短时间之内完成写作。对于已经完成的东西,基于一些条件的改变或者勘误,或者大家提出的意见,笔者也会考虑做出适当的修改。1.4,本系列的结构第1章,也就是本章第2章,从Hello,World!开始第3章,类的声明和定义第4章,继承第5章,Class类型,选择器Selector以及函数指针第6章,NSObject的奥秘第7章,对象的初始化以及实例变量的作用域第8章,字符串,数组以及字典第9章,内存管理第10章,到目前为止出现的内存泄漏事件第11章,属性第12章,类目(Categories)第13章,协议(Protocols)第14章,Delegate第15章,线程第16章,文件系统第17章,数据系列化以及保存用户数据第18章,网络编程第19章,XML解析上面带连接的章节是已经完成的章节,否则就是还没有发布的。发布过的讲座的内容可能会更新,甚至本系列讲座的结构会发生改变。Objective-C2.0withCocoaFoundation---2从Hello,World!开始现在笔者假设大家已经有了开发的环境。好了,我们开始构筑我们的第一个程序。在开始第一个程序之前,笔者需要提醒大家一下,如果手里面有开发环境的话并且是第一次亲密接触Xcode的话,为了可以熟悉开发环境,强烈建议按照笔者的步骤一步一步的操作下去。2.1,构筑Hello,World第一步,启动Xcode。初次启动的时候,也许会弹出一个“WelcometoXcode”的一个对话框。这个对话框和我们的主题没有关系,我们可以把它关掉。第二步,选择屏幕上部菜单的“File-NewProject”,出现了一个让你选择项目种类的对话框。你需要在对话框的左边选择“CommandLineUtility”,然后在右边选择“FoundationTool”,然后选择“Choose...”按钮。如图2.1所示。图2-1,新建项目注意也许有人会问,你不是要讲解iPhone的开发,那么为什么不选择“iPhoneOS”下面的“Application”呢?是这样的,在这个系列当中,笔者主要侧重于Objective-C的语法的讲解,为了使得讲解简单易懂,清除掉所有和要讲解的内容无关的东西,所以笔者在这里只是使用最简单的命令行。第三步,Xcode会提问你项目的名字,在“SaveAs”里面输入“02-HelloWorld”,然后选择“Save”。如图2-2所示图片看不清楚?请点击这里查看原图(大图)。图2-2,输入项目的名字第四步,得到一个如图2-3所示的一个画面。尝试一下用鼠标分别点击左侧窗口栏里面的“02-HelloWorld”,“Source”.“Documentation”,“ExternalFrameworksandLibraries”,“Products”,然后观察一下右边的窗口都出现了什么东西。一般来说,“02-HelloWorld”就是项目的名字下面是项目所有的文件的列表。项目下面的子目录分别是和这个项目相关的一些虚拟或者实际上的目录。为什么我说是虚拟的呢?大家可以通过Finder打开你的工程文件的目录,你会发现你的所有文件居然都在根目录下,根本就不存在什么“Source”之类的目录。图片看不清楚?请点击这里查看原图(大图)。图2-3,项目浏览窗口第五步,选择屏幕上方菜单的“Run”然后选择“Console”,出现了如图2-4所示的画面,用鼠标点击窗口中间的“BuildandGo”按钮。图片看不清楚?请点击这里查看原图(大图)。图2-4,运行结果画面如果不出什么意外的话,大家应该看到我们熟悉得不能再熟悉的“HelloWolrd!”。由于我们没有写任何的代码,所以从理论上来说,这部分代码不应该出现编译错误。好的,从下面开始,笔者要开始对这个HelloWorld里面的一些新鲜的东西进行讲解。2.2,头文件导入在Java或者C/C++里面,当我们的程序需要引用外部的类或者方法的时候,需要在程序源文件中包含外部的类以及方法的包(java里面的jarpackage)或者头文件(C/C++的.h),在Objective-C里面也有相类似的机制。笔者在这一节里面将要向大家介绍在Objective-C里面,头文件是怎样被包含进来的。请同学们到Xcode开发环境的左侧窗口里面,点击Source文件夹,然后就在右侧部分看到了代码源文件的列表,找到02-HelloWorld.m之后单击会在Xcode的窗口里面出现,双击鼠标代码会在一个新窗口出现,请同学们按照这种方法打开02-HelloWorld.m。对于Java程序来说,源程序的后缀为.java,对于C/C++代码来说,后缀为c/cpp,现在我们遇到了.m。当Xcode看到了.m文件之后,就会把这个文件当作Objective-C文件来编译。同学们也许会猜到,当Xcode遇到c/cpp,或者java的时候也会对应到相应的语言的。好的,我们顺便提了一下Xcode对.m文件的约定,现在我们开始从第一行代码讲起,请参看下列代码:1#importFoundation/Foundation.h23intmain(intargc,constchar*argv[]){4NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];56//insertcodehere7NSLog(@Hello,World!);8[pooldrain];9return0;10}11有过C/C++经验的同学看到第一行,也许会觉得有些亲切;有过Java经验的同学看到第一行也许也会有一种似曾相识的感觉。同学们也许猜到了这是干什么用的,没错,这个正是头文件。不过,在C/C++里面是#include,在java里面是import,这里是#import。在C/C++里面会有#include互相包含的问题,这个时候需要#ifdef来进行编译的导向,在Xcode里面,同学们可以放心的包含各种东西,这个没有关系,因为我们的编译器有足够的“聪明”,因为同一个头文件只是被导入一次。除了#import变得聪明了一点之外,和#include的功能是完全一样的。我们再来看看我们的另外一个新的朋友---Foundation.h。这个是系统框架Foundationframework的头文件,有了它你可以免费的获取系统或者说苹果公司为你精心准备的一系列方便你使用的系统功能,比如说字符串操作等等。Foundation框架从属于Cocoa框架集,Cocoa的另外一个框架为ApplicationKit,或者是UIKit,其中前者的应用对象为MACOS,后者的应用对象为iPhoneOS。本系列入门指南将只是使用Foundation,因为笔者需要向同学们介绍Objective-C的基本使用方法,为了避免过多的新鲜东西给同学们造成阅读上的困难,所以命令行就已经足够了。说到这里,笔者需要澄清一点,其实MACOS的Cocoa和iPhone的Cocoa是不一样的,可以说,其中iPhone是MACOS的一个子集。2.3,main函数有过C/C++或者java经验的同学们对第3行代码应该很熟悉了,是的大家都一样主程序的入口都是main。这个main和C/C++语言里面的main是完全一样的,和java语言在本质上也是完全一样的。因为Objective-C完全的继承了C语言的特性。确切的说,不是说Objective-C和C语言很相似,而是Objective-C和C语言是完全兼容的。关于main函数是干什么用的,笔者就不在这里罗嗦了,有兴趣的同学可以找一本C语言的书看看。2.4,关于NSAutoreleasePool自己动手,丰衣足食---在第4行,我们遇到了另外一个新鲜的东西,这就是NSAutoreleasePool。让我把这个单词分为三部分,NS,Autorelease和Pool。当我们看到NS的时候,也许不知道是代表着什么东西。NS其实只是一个前缀,为了避免命名上的冲突。NS来自于NeXTStep的一个软件,NeXTSoftware的缩写,NeXTSoftware是Cocoa的前身,一开始使用的是NS,为了保持兼容性所以NS一直得以保留。在多人开发的时候,为了避免命名上的冲突,开发组