学习Objective-C入门教程.pdf

上传人:奔*** 文档编号:89816745 上传时间:2023-05-13 格式:PDF 页数:82 大小:11.05MB
返回 下载 相关 举报
学习Objective-C入门教程.pdf_第1页
第1页 / 共82页
学习Objective-C入门教程.pdf_第2页
第2页 / 共82页
点击查看更多>>
资源描述

《学习Objective-C入门教程.pdf》由会员分享,可在线阅读,更多相关《学习Objective-C入门教程.pdf(82页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、学 习 Ob je c tiv e-C 入门教程(全)学习Objective-C入门教程1.刖舌相 信 iPhone不久就要在国内发布了,和我们在国内可以通过正规渠道买得到的iPodTouch一样,iPhone也是一个激动人心的产品。iPhone发布的同时,基 于 iPhone的程序也像雨后春笋一样在iTunes里面冒出来。你将来也许会考虑买一个iP hone,体验一下苹果的富有创意的种种应用;你也许会考虑向 iTunes的社区的全世界的人们展示一下你非凡的创意,当然也可以通过你的创意得到一些意想不到的收益。0 K,你也许迫不及待的准备开发了。但是先等一下,让我们回忆一下最初的电影是怎么拍摄的

2、。这个很重要,因为和iPhone的开发比较类似。在最初因为器材比较原始,所以拍摄电影需要很高的技术,那个时候的电影的导演基本上是可以熟练操作摄影器材的人。随着器材的完善,使用也简单起来。于是器材的使用不是决定一个电影的质量的唯一的因素,取而代之的是故事或者说电影的创意。iPhone的开发也是这样。当然从入门到掌握的过程来说任何事情都是开始比较难,随着掌握的程度的加深,你将会觉得开发iPhone应用程序是一件简单而且轻松的事情,到了那个时候,你的主要的制胜武器就不是开发技术,而是你的创意了。对于你来说,我在这里写的东西都是有关“摄影器材”也就是介绍如何使用iPhone的平台来开发应用程序。iPh

3、one的开发语言是Objective-C。Objective-C是进行iPhone开发的主要语言,掌握了 Objective-C的基本语法以及数据结构之后,你需要熟悉一下iPhone的 SDK。笔者很难做到在一篇文章里面把所有的东西都介绍清楚,所以笔者打算分成两个主题,一个是O bjective-C,一个是 iPhone 开发。本系列将侧重于Objective-C。当然,任何一种开发语言都无法脱离于运行环境,Objective-C也不例外。所以在本系列当中也会穿插的介绍一些SDK里面的一些特性,主要是数据结构方面,比如说NSString,NSArray等等。看到NSString,NSArray

4、这些名词,你也许会感到有些茫然,不过没有关系,随着本系列的深入介绍,你会发现你非常喜欢这些东西。1.1,谁会考虑阅读本系列如果你对iPhone感兴趣,如果你考虑向全世界的人们展示你的创意,如果你有一颗好奇心,如果你打算通过开发iPhone程序谋生,如果你觉得苹果比Windows酷,如果你认为不懂苹果的话那么就有些不时尚的话,那么可以考虑阅读本系列。老手也可以考虑花一点时间阅读一下,可以发帖子和笔者交流切磋。笔者发布的文章属于公益写作,旨在为大家介绍iPhone开发的一些基础知识,如果可以提供宝贵意见,笔者将不胜感激。1.2,需要准备的东西第一,你需要一台苹果电脑。当然这个不是必需的条件,如果你

5、可以在你的IntelPC上成功安装MAC0S的话,那么请忽略这一条。第二,你需要去苹果网站上下载开发工具XC0DE。注意,XC0DE是完全免费的,但是需要你去注册一个账号才可以下载。由于XCODE不时的在更新,所以如果你的MAC0S不支持你下载的XC0DE的话,那么你也许需要考虑买一个最新的MAC0S。第三,你需要至少有C,C+,或 者 JAVA的背景知识。不过如果你没有,那么也不用担心,相信阅读了笔者的文章之后应该也可以掌握。最后需要的东西就不是必须的了,当然有的话会更好一些。这些东西是,开发者账户(需要付费),iPhone手机(在部分国家可以免费获得,但是中国会怎么样,笔者不是很清楚),i

6、PodTouch(需要购买)。1.3,关于笔者的写作笔者利用业余时间进行写作,所以无法对文章发布的时间表做出任何保证,还请各位读者谅解。但是笔者会尽最大努力在短时间之内完成写作。由于笔者经验才识所限,在本教程当中难免会遇到遗漏,借误甚至荒谬的地方,所以还请同学们批评指正。对于已经完成的章节,基于一些条件的改变或者勘误,或者大家提出的意见,笔者也会考虑做出适当的修改。在每一个章节都会有代码的范例,笔者注重阐述基本概念所以代码难免会有不完整或者错误的地方,同学们可以任意的在自己的代码中使用笔者所写的代码,但是笔者不承担由于代码错误给同学们带来的损失。同学们在阅读本教程的时候,可以直接下载范例代码运

7、行,但是为了熟悉编码的环境以及代码的规范,笔者强烈建议同学们按照教程自己亲自输入代码。Objective-C的概念比较多,而且很多概念都相互交叉。比如说讲解概念A 的时候,需要概念B 的知识,讲解概念B 的时候需要概念C 的知识,讲解概念C 的时候需要概念A,这样就给本教程的写作带来了一定的麻烦,很明显笔者无法在某一个章节里面把所有的概念都讲述清楚,所以每一章都有侧重点,大家在阅读的时候需要抓住每一章的侧重点,忽略一些和本章内容无关的新的概念和知识。1.4,本系列的结构第1章,也就是本章第2章,从Hello,World!开始第3章,类的声明和定义第4章,继承第5章,Class类型,选择器Sel

8、ector以及函数指针第6章,NSObject的奥秘第7章,对象的初始化以及实例变量的作用域第8章,类方法以及私有方法第9章,内存管理第10章,到目前为止出现的内存泄漏事件第11章,字符串,数组以及字典第12章,属性第 13 章,类目(Categories)第 14 章,协 议(Protocols)第 15 章,Delegate第16章,线程第17章,文件系统第18章,数据系列化以及保存用户数据第19章,网络编程第20章,XM L解析2,从Hello,World!开始本系列讲座有着很强的前后相关性,如果你是第一次阅读本篇文章,为了更好的理解本章内容,笔者建议你最好从本系列讲座的第1章开始阅读,

9、请点击这里。现在笔者假设大家已经有了开发的环境。好了,我们开始构筑我们的第一个程序。在开始第一个程序之前,笔者需要提醒大家一下,如果手里面有开发环境的话并且是第一次亲密接触Xcode的话,为了可以熟悉开发环境,强烈建议按照笔者的步骤一步一步的操作下去。2.1,构筑 Hello,World第一步,启动Xcode。初次启动的时候,也许会弹出一个WelcometoXcode”的一个对话框。这个对话框和我们的主题没有关系,我们可以把它关掉。第二步,选择屏幕上部菜单的“File-NewProject”,出现了一个让你选择项目种类的对话框。你需要在对话框的左边选择“CommandLineUtility”,

10、然后在右边选择“FoundationTool”,然后选择“C hoose.按钮。如图 2.1 所示。图2-1,新建项目注意也许有人会问,你不是要讲解iPhone的开发,那么为什么不选择iPhoneOS”下面 的“Application”呢?是这样的,在这个系列当中,笔者主要侧重于Objective-C的语法的讲解,为了使得讲解简单易懂,清除掉所有和要讲解的内容无关的东西,所以笔者在这里只是使用最简单的命令行。第三步,Xcode会提问你项目的名字,在“SaveAs”里面输入“02-HelloWorldw,然后选择“Save”。如图2-2所示图2-2,输入项目的名字第四步,得到一个如图2-3所示的

11、一个画面。尝试一下用鼠标分别点击左侧窗口栏里面的02-HelloWorld,Source.Documentation,aExternalFrameworksandLibrariesw,“Products”,然后观察一下右边的窗口都出现了什么东西。一般来说,“02TlelloWorld”就是项目的名字下面是项目所有的文件的列表。项目下面的子目录分别是和这个项目相关的一些虚拟或者实际上的目录。为什么我说是虚拟的呢?大家可以通过Finder打开你的工程文件的目录,你会发现你的所有文件居然都在根目录下,根本就不存在什么Source”之类的目录。图2-3,项目浏览窗口第五步,选择屏幕上方菜单的“Run”

12、然后选择“Console,出现了如图2-4所示的画面,用鼠标点击窗口中间的“BuildandGo”按钮。图2-4,运行结果画面如果不出什么意外的话,大家应该看到我们熟悉得不能再熟悉的“HelloWolrd!”。由于我们没有写任何的代码,所以从理论上来说,这部分代码不应该出现编译错误。好的,从下面开始,笔者要开始对这个H e l l o W o r l d 里面的一些新鲜的东西进行讲解。2.2,头文件导入在 J a v a 或者C/C+里面,当我们的程序需要引用外部的类或者方法的时候,需要在程序源文件中包含外部的类以及方法的包(j a v a 里面的j a r p a c k a g e)或者头

13、文件(C/C+的.h),在 O b j e c t i v e-C 里面也有相类似的机制。笔者在这一节里面将要向大家介绍在O b j e c t i v e-C 里面,头文件是怎样被包含进来的。请同学们到X c o d e 开发环境的左侧窗口里面,点击S o u r c e 文件夹,然后就在右侧部分看到了代码源文件的列表,找到0 2-H e l l o W o r l d.m之后单击会在X c o d e 的窗口里面出现,双击鼠标代码会在一个新窗口出现,请同学们按照这种方法打开 0 2 T I e n oW orld.对 于 J ava程序来说,源程序的后缀为.java,对 于 C/C+代码来

14、说,后缀为c/cpp,现在我们遇到了.m。当 X code看到了.m文件之后,就会把这个文件当作O bjective-C 文件来编译。同学们也许会猜到,当 X code遇 到 c/cpp,或 者 java的时候也会对应到相应的语言的。好的,我们顺便提了一下X code对.m文件的约定,现在我们开始从第一行代码讲起,请参看下列代码:l#import23 intmain(intargc,constchar*argv)4N S A utoreleaseP ool*pool=N S A utoreleaseP oolallocinit;56/insertcodehere7N S L og(H ello

15、,W orld!);8pooldrain;9 return0;1 0 1 1有 过 C/C+经验的同学看到第一行,也许会觉得有些亲切;有过Java经验的同学看到第一行也许也会有一种似曾相识的感觉。同学们也许猜到了这是干什么用的,没错,这个正是头文件。不过,在 C/C+里面是#in c lu d e,在 jav a里面是im p o rt,这里是#import。在 C/C+里面会有#include互相包含的问题,这个时候需要#ifd e f来进行编译的导向,在 Xcode里面,同学们可以 放心的 包含各种东西,这个没有关系,因为我们的编译器有足 够 的“聪明”,因为同一个头文件只是被导入一次。除

16、了#im port变得聪明了一点之外,和#include的功能是完全一样的。我们再来看看我们的另外一个新的朋友-Foundation,h。这个是系统框架Foundationframework的头文件,有了它你可以免费的获取系统或者说苹果公司为你精心准备的一系列方便你使用的系统功能,比如说字符串操作等等。Foundation框架从属于Cocoa框架集,Cocoa的另外一个框架为A pplicationK it,或者是U IK it,其中前者的应用对象为MAC0S,后者的应用对象为iPhoneOS。本系列入门指南将只是使用Foundation,因为笔者需要向同学们介绍Objective-C的基本使

17、用方法,为了避免过多的新鲜东西给同学们造成阅读上的困难,所以命令行就已经足够了。说到这里,笔者需要澄清一点,其实MACOS的 Cocoa和 iPhone的 Cocoa是不一样的,可以说,其 中 iPhone是 MACOS的一个子集。2.3,main 函数有过C/C+或 者 jav a经验的同学们对第3 行代码应该很熟悉了,是的大家都一样主程序的入口都是main。这个main和 C/C+语言里面的main是完全一样的,和 jav a语言在本质上也是完全-一样的。因为Objective-C完全的继承了 C语言的特性。确切的说,不是说Objective-C和 C语言很相似,而是Objective-C

18、和 C语言是完全兼容的。关于m ain函数是干什么用的,笔者就不在这里罗嗦了,有兴趣的同学可以找一本C语言的书看看。2.4,关于 NSAutoreleasePool自己动手,丰衣足食一一在 第 4 行,我们遇到了另外一个新鲜的东西,这就是NSAutoreleasePool。让我把这个单词分为三部分,NS,A utorelease和 Pool。当我们看到NS的时候,也许不知道是代表着什么东西。NS其实只是一个前缀,为了避免命名上的冲突。NS来自于NeXTStep的一个软件,NeXTSoftware的缩写,NeXTSoftware是 Cocoa的前身,一开始使用的是N S,为了保持兼容性所以NS

19、一直得以保留。在多人开发的时候,为了避免命名上的冲突,开发组的成员最好事先定义好各自的前缀。但是,最好不要有同学使用NS前缀,这样会让其他人产生误解。略微有些遗憾的是,Objective-C不支持namespace关键字,不知道后续的版本是否会支持。下面我们讨论,一下Autorelease和Pool。程序在执行的时候,需要向系统申请内存空间的,当内存空间不再被使用的时候,毫无疑问内存需要被释放,否则有限的内存空间会很快被占用光光,后面的程序将无法得到执行的有效内存空间。从计算机技术诞生以来,无数的程序员,我们的无数先辈都在为管理内存进行努力的工作,发展到现在,管理内存的工作已经得到了非常大的完

20、善。在Objective-C或者说Cocoa里面,有三种内存的管理方式。第一种,叫 做“Garbagecollection”。这种方式和java类似,在你的程序的执行过程中,始终有一个高人在背后准确地帮你收拾垃圾,你不用考虑它什么时候开始工作,怎样工作。你只需要明白,我申请了一段内存空间,当我不再使用从而这段内存成为垃圾的时候,我就彻底的把它忘记掉,反正那个高人会帮我收拾垃圾。遗憾的是,那个高人需要消耗一定的资源,在携带设备里面,资源是紧俏商品所以iPhone不支持这个功能。所以uGarbageCo 11 ectionw不是本入门指南的范围,对uGarbageCollection*内部机制感兴

21、趣的同学可以参考一些其他的资料,不过说老实话“GarbageCollection”不大适合适初学者研究。第二种,叫 做“ReferenceCounted”。就是说,从一段内存被申请之后,就存在一个变量用于保存这段内存被使用的次数,我们暂时把它称为计数器,当计数器变为0的时候,那么就是释放这段内存的时候。比如说,当在程序A里面一段内存被成功申请完成之后,那么这个计数器就从0变 成1 (我们把这个过程叫做alloc),然后程序B也需要使用这个内存,那么计数器就从1变成了 2(我们把这个过程叫做retain)。紧接着程序A不再需要这段内存了,那么程序A就把这个计数器减1 (我们把这个过程叫做rele

22、ase);程序B也不再需要这段内存的时候,那么也把计数器减1 (这个过程还是release)。当系统(也就是Foundation)发现这个计数器变成了 0,那么就会调用内存回收程序把这段内存回 收(我们把这个过程叫做dealloc)。顺便提一句,如果没有Foundation,那么维护计数器,释放内存等等工作需要你手工来完成。这样做,有一个明显的好处就是,当我们不知道是A先不使用这段内存,还 是B先不使用这段内存的时候,我们也可以非常简单的控制内存。否则,当我们在程序A里面释放内存的时候,还需要看看程序B是否还在使用这段内存,否则我们在程序A里面释放了内存之后,可怜的程序B符无法使用这段内存了。

23、这种方式,尤其是在多线程的程序里面很重要,如果多个线程同时使用某一段内存的时候,安全的控制这些内存成为很多天才的程序员的梦魇。如果有同学搞过COM的话,那么应该对Release/AddRef很熟悉了,其实Obe jet ive-C和他们的机制是一样的。接下来,我需要解释一下Autorelease方式。上述的alloc-retain-release-dealloc过程看起来比较令人满意,但是有的时候不是很方便,我们代码看起来会比较罗嗦,这个时候就需要Autorelease。Autorelease的意思是,不是立即把计数器减1而是把这个过程放在线程里面加以维护。当线程开始的时候,需要通知线程(N

24、S A u t o r e l e a s e P o o l),线程结束之后,才把这段内存释放(d r a i n)。C o c o a 把这个维护所有申请的内存的计数器的集合叫做p o o l,当不再需要p o o l (水池)的时候就要d r a i n(放水)。笔者想要说的是,虽 然 i P h on e支持A u t orel eas e但是我们最好不要使用。因为A u t orel eas e方式从本质上来说是一种延迟释放内存的机制,手机的空间容量有限,我们必须节约内存,确定不需要的内存应该赶快释放掉,否则当你的程序使用很多内存的情况下也许会发生溢出。这一个习惯最好从刚刚开始学习使

25、用O bj ect i v e-C 的时候就养成,否则长时间使用A u t orel eas e会让你变得“懒散”,万一遇到问题的时候,解决起来会非常耗费时间的。所以,还是关于内存管理,我们还是自己动手,丰衣足食。当然笔者不是说绝对不可以使用,而是当使用A u t orel eas e可以明显减低程序复杂度和易读性的时候,还是考虑使用一下换一下口味。说到这里,可能有的同学已经开始发晕了,认为这个东西比较难以理解。是的,笔者在这里只是介绍一个大概的东西,在这里只要了解计数器的概念就可以了,笔者将在随后的章节里面对这个功能加以详细论述,请同学们放心,这个东西和H el l oW orl d一样简单

26、。关 于 P ool在使用P ool 的时候,也要记住系统给你的P ool 的容量不是无限大的,从这一点来说和在现实世界的信用卡比较相似。你可以在一定程度透支,但是如果“忘记掉”信用卡的额度的话,会造成很大的系统风险。第三种,就是传统而又原始的C语言的方式,笔者就不在这里叙述了。除非你在O bj ect i v e-C 里面使用C代码,否则不要使用C的方式来申请和释放内存,这样会增加程序的复杂度。线程是什么东西?线程指的是进程中一个单一顺序的控制流。它是系统独立调度和分派的基本单位。同一进程中的多个线程将共享该进程中的全部系统资源,比如文件描述符和信号处理等等。一个进程可以有很多线程,每个线程

27、并行执行不同的任务。2.5,关于 N S Au t ore l e a s e P ool a l l oc i ni t ;关于程序第4 行等号右边出现的括弧以及括弧里面的内容,笔者将在后续的章节里面介绍。在这里,同学们可以理解为,通过告诉Ob j e c t i v e-C编译器 N S Au t ore l e a s e P ool a l l oc i ni t ,编译器就会成功的编译生成 N S Au t ore l e a s e P oo 对象的代码就可以了。2.6,Ob j e c t i v e-C里面的注释同学们在第6 行看到了的注释,这个和C+以及Ja v a 是一样的

28、,表示这一行的内容是注释,编译器将会忽略这一行的内容。笔者在上面说过Ob j e c t i v e-C完全兼容C 语言,所以 C 语言里面传统的/*/在 Ob j e c t i v e-C里面也是有效的。2.7,命令行输出第 7 行,我们看到了 N S Log 这个函数。N S 上面已经讲过了,我们都知道Log 是什么意思,那么这段代码的意思就是输出一个字符串,X c od e 的代码生成器自己把字符串定义为 He l l o,W orl d!。N S Log 相当于C 语言里面的pri nt f,由于我们是在使用Ob j e c t i v e-C所以笔者将会和同学们一起,在这里暂时忘记

29、掉我们过去曾经熟悉的pri nt f o有眼光锐利的同学会发现在字符串的前面多了一个回符号,这是一个什么东西呢?如前所述,Ob j e c t i v e-C和 C 是完全兼容的,但是N S Log 这个函数需要的参数是N S S t ri ng,这样就产生了一个问题,如果使用C 的字符串方式的话,为了保持和C 的兼容性编译器将会把字符串理解为C 的字符串。为了和C 的字符串划清界限,在 C 的字符串前面加上符号,Ob j e c t i v e-C的编译器会认为这是个N S S t ri ng,是一个N S Log 喜欢的参数。为什么N S Log 或者Coc oa 喜欢使用N S S t

30、ri ng?因为N S S t ri ng 封装了一系列的字符串的方法比如字符串比较,字符串和数字相互转换等等的方法,使用起来要比C 的字符串方便的多。2.8,本章总结非常感谢同学们耐心的看到这里!通过理解本章的内容,同学们应该可以使用X c od e 创建一个命令行的工程,理解.m 文件的基本要素,理解内存的管理方法的思路,还有O b j e c t i v e-C 的注释的写法,以及命令行的输出方法。是不是很简单又很有乐趣呢?笔者将会尽最大努力把看起来复杂的东西讲解的简单一些,并且真心的希望大家可以从中找到乐趣。3,类的声明和定义本系列讲座有着很强的前后相关性,如果你是第一次阅读本篇文章,

31、为了更好的理解本章内容,笔者建议你最好从本系列讲座的第1 章开始阅读,请点击这里。上一章我们写了一个非常简单的O b e j c t i v e-C 下面的H e l l o,W or l d!的小程序,并且对里面出现的一些新的概念进行了解释。这一章,我们将要深入到O b j e c t i v e-C 的一个基本的要素,也就是类的声明和定义。通过本章的学习,同学们应该可以定义类,给类加上变量,还有通过方法访问类的变量。不过准确的说,变量和方法的名词在O b j e c t i v e 里面并不是最准确的称呼,我们暂时引用J a v a 的定义,稍后我们将统一我们的用语定义。3.1,本章的程序

32、的执行结果。我们将构筑一个类,类的名字叫做C a t t l e,也就是牛的意思,今年是牛年而且我还想给在股市奋战的同学们一个好的名字,所以我们暂时把这个类叫做牛类。我们在m a i n 里面初始化这个牛类,然后调用这个类的方法设定类的变量,最后调用这个类的一个方法,在屏幕上输出,最终输出的结果如下图3-1 所示图3-1,牛类的输出结果完整的代码在这里。不过为了熟悉编辑环境以及代码,笔者强烈建议同学们按照下面的步骤自己输入。3.2,实现步骤第一步,按照我们在第二章所述的方法,新建一个项目,项目的名字叫做0 3-H e l l oC l a s S o当然,你也可以起一个别的更好听的名字,比如说

33、H e l l oC a t t l e 等等,这个并不妨碍我们的讲解。如果你是第一次看本系列文章,请到这里参看第二章的内容。第二步,把鼠标移动到左侧的窗口的“S o u rce”目录,然后单击鼠标右键,选择“A dd”,然后界面上会出来一个子菜单,在子菜单里面选择 New Fi l e”。如图3-2所示:图 3-2,新建文件第三步,在新建文件对话框的左侧选择“Co co aT o u ch Cl as s es”,然后在右侧窗口选择aNS Obj ect s u bcl as sn,然后单击 Nex t 。如图 3-3 所示:第 四 步,在“New Fi l e”对话框里面的“FeNam e

34、”栏内输入“Cat t l e,m。注意,在确省状态下,X co de为你加上了“.m”的后缀,这个也是编译器识别Obj ect i ve-C源文件的方法,没有特殊理由请不要修改这个后缀,否则会让编译器感到不舒服。另外请确认文件名字输入栏的下方有一个 A l s o creat e Cat t el.h ”选择框,请保持这个选择框为选择的状态。如 图 3-4 所示。第 5步,在项目浏览器里面选择 Cat t l e,h”文件,把文件改为如下代码并且保存(Co m m an d 键+S):#i m p o rt i n t erf aceCat t l e:NS Obj ect i n t l

35、egs Co u n t;-(vo i d)s ay S o m et h i n g;-(vo i d)s et L egs Co u n t:(i n t)co u n t;en d为什么l egs Cat t l e者,牛也;l egs 者,股也。不过牛股里面的牛正确的英文说法应该是 B u l l,请大家不要着急,我们会在类的继承里面命名一个B u l l 类的。第六步,在项目浏览器里面选择 Cat t l e,m”文件,把文件改为如下代码并且保存(Co m m an d 键+S):#i m p o rt,/Cat t l e.h i m p l em en t at i o n Ca

36、t t i e-(vo i d)s ay S o m et h i n g(NS L o g(,zHel l o,l am acat t l e,Ih ave%dl egs.l egs Co u n t);)-(vo i d)s et L egs Co u n t:(i n t)co u n t(l egs Co u n t=co u n t;)en d第七步,在项目浏览器里面选择“0 3-Hel Io Cl as s.m”文件,把文件改为如下代码并且保存(Co m m an d 键+S):#i m p o rt t t i m p o rt Cat t l e.h i n t m ai n(

37、i n t argc,co n s t ch ar*argv)NS A u t o rel eas eP o o l*p o o l=NS A u t o rel eas eP o o l al l o ci n i t;i dcat t l e=Cat t l en ew;cat t l es et L egs Co u n t:4 1;cat t l es ay S o m et h i n g;p o o l drai n;ret u rn O;第八步,选择屏幕上方菜单里面的“R u n”,然后选择“Co n s o l e”,打开了 Co n s o l e对话框之后,选择对话框上部中

38、央的“B u i l dan dGo ,如果不出什么意外的话,那么应该出现入图3-1 所示的结果。如果出现了什么意外导致错误的话,那么请仔细检查-下你的代码。如果经过仔细检查发现还是不能执行的话,可以到这里下载笔者为同学们准备的代码。如果笔者的代码还是不能执行的话,请告知笔者。3.3,类的声明从 O b j e c t i v e-C 名字我们就可以得知,这是一个面向对象的语言。面向对象的一个最基础的要素就是类的概念,O b j e c t i v e-C 也不例外。所谓的类的概念,其实是从C语言的结构体发展而来的。我们知道,C语言里面的结构体仅仅有数据的概念,面向对象的语言不仅仅支持数据,还

39、可以在结构体里面封装用于存取结构体数据的方法。结构体的数据和方法结合,我们把整个结构体称为类(C l a s s)。仅仅有了类,是不能执行任何操作的,我们必须把类进行实体化,实体化后的类我们称之为对象(O b j e c t)。从这个角度上来说,我们可以认为类是对象的模版。如果要使用类,那么和构造体相类似,我们必须声明这个类。请 参 照“C a t t l e,h”文件:1#i m p o r t 234 i n t e r f a c e C a t t l e:N S0 b j e c t 5 i n t l e g s C o u n t;6 7-(v o i d)s a ySo m e

40、 t h i n g;8-(v o i d)s e t L e g s C o u n t:(i n t)c o u n t;9 e n d如果看过本系列第二章的同学们,第行应该是一个老面孔了,我们知道我们需要这个东西免费获得苹果公司为我们精心准备的F o u n d a t i o n F r a m c wo r k 里面的很多的功能。如果不使用这个东西的话,我们的工作将会很复杂。同学们请看第4行和第9行的第一个字母,又出现了 符号。为什么说又呢,因为我们在第:章的字符串前面也看到过这个东西。字符串前面出现这个符号是因为我们需要和 C语言的字符串定义区别开来,我们需要编译器导向。在这里,我

41、要告诉同学们的是,这 里 的“”符号的作用还是同样是编译器导向。我们知道J a v a 和 C+定义了一个关键字c l a s s 用于声明一个类,在 O b j e c t i v e-C 里面,不存在这样的关键字。在 O b j e c t i v e-C 里面,类的定义从 i n t e r f a c e 开始到 e n d 结束,也就是说,编译器看到了 i n t e r f a c e 就知道了这是类的定义的开始,看到了 e n d 就知道,类的定义结束了。我们这里类的名字是“C a t t l e”,我们使用了空格和 i n t e r f a c e 分开,通知编译器,我们要声

42、明一个类,名字叫做C a t t l e。在 C a t t l e 的后面,我 们 有 :N SO b j e c t”,这是在通知编译器我们的C a t t l e 是从N SO b j e c t 继承而来的,关于继承和N SO b j e c t,我们将在后面的章节里面详细介绍,关 于“:N SO b j e c t”我们现在可以理解为,通过这样写,我们免费获得了苹果公司为我们精心准备的一系列的类和对象的必备的方法。N SO b j e c t 被称为r o o t c l a s s,也就是根类。在 J a v a 或者.N E T里面,根类是必备的,C+不需要。在O b e j c

43、 t i v e-C 里面原则上,你可以不使用N S O b j ec t,构筑一个你自己的根类,但是事实上这样做将会有很大工作量,而且这样做没有什么意义,因为苹果为你提供的N S O b j ec t 经过了很长时间的检验。也许有好奇心的同学们想自己构筑根类,不过至少笔者不会有自己去构筑一个根类的欲望。好的,大家现在来看第5行。我们以前把这个东西叫做变量,我们从现在开始,需要精确的使用O b j ec t i v e-C 的用语了,这是实体变量(i ns t a nc ev a r i a b les,在有的英文资料里面会简写为i V a r s)。虽然作为一个C a t t le,它有不止

44、一个实体变量,比如说体重等等,但是为了代码简洁,我们在这里声明一个就是牛腿也就是牛股的数目,这个实体变量是 i nt 型,表示一个整数,我们当然不希望有4.5个牛腿。我们来看第6行,第 6行的括弧和在第4行最后的括弧用来表示实体变量的定义区间,编译器认为在这两个括弧之间的定义是实体变量的定义。当然,如果你的类没有实体变量,那么这两个括弧之间允许什么都没有。和 J a v a 以及C+不一样,O b j ec t i v e-C 要求在括弧里面不能有方法也就是函数的定义,那么O b j ec t i v e-C 里面的方法的定义放在什么地方呢,请看第7 行。第 7 行 的 第 一 个 字 母 是

45、 一 个 减 号。这个减号就是告诉编译器,减号后面的方法,是实体方法(i ns t a nc emet hod)。实体方法的意思就是说,这个方法在类没有被实体化之前,是不能运行的。我们在这里看到的是减号,在有减号的同时也有加号,我们把带加号的方法称为类方法(c la s s met hod),和实体方法相对应,类方法可以脱离实体而运行。关于类方法,我们将在后面的章节里面讲解。大家也许可以想起来在C+和 J a v a 里面同样也有类似的区分,不是么。在 O b j ec t i v e-C 里面方法的返回类型需要用圆括号包住,当编译器看到减号或者加号后面的括号了之后,就会认为这是在声明方法的返

46、回值。你也可以不声明返回值,O b j ec t i v e-C 的编译器会给没有写显式的返回值函数加上一个默认的返回值,它的类型是i d,关 于 i d 类型我们将在后面讲解,不过笔者不推荐不写返回值的类型。在 第 7 行我们定义了这个方法的名字是s a yS omet hi ng,当然C a t t le说的话我们人类是听不懂的,笔者只是想让它在我们的控制台里面输出一些我们可以看得懂得字符串。方法的声明最后,需要分号来标识,这一点保持了和C没有任何区别。我们再来看看第8行,第 8行和第7行多了“:(i n t)c o u n t ”。其中冒号放在方法的后面是用来表示后面是用来定义变量的,同

47、样变量的类型使用括号给包住,如果不写变量的类型的化,编译器同样认为这是一个i d 类型的。最后的c o u n t,就是变量的名字。如果有不只一个变量怎么办?答案就是在第一个变量后面加冒号,然后加园括号包住变量的类型,接着是变量的名字。好了,我们在这里总结一下,类的定义方法如下:i n t er fa c e类的名字:父类的名字实体变量类型实体变量名字;)-(返回值类型)方法名字;+(返回值类型)方法名字;-(返回值类型)方法名字:(变量类型)变量名字标签1:(变量类型)变 量 1 名字;en d.的意思在本系列入门讲座里面,.一表示省略了一些代码的意思。3.4,类的定义我们在前一节讲述了类的

48、声明,我们下一步将要看一下类的定义。请同学们打开 C a t t l e,m文件:l#i m p o r tz zC a t t l e,h”234 i m p l em en t a t i o n C a t t l e5-(vo i d)s a y S o m et h i n g6 7 N S L o g(Z/H el l o,l a m a c a t t l e,I h a ve%d l egs.”,l egs C o u n t);8)9-(vo i d)s et L egs C o u n t:(i n t)c o u n t1 0 1 1 l egs C o u n t=c

49、o u n t;1 2)1 3 en d1 4C a t t l e.m文件的第一行就i m p o r t 了 C a t t l e.h文件,这一点和C的机制是一样的,关于ft i m p o r t 的说明请参照第二章。我们来看第4行和第1 3 行,和头文件里面的 一样,我们这里类的定义也是使用的编译导向。编译器会把从 i m p l em en t a t i o n 到 6 期之间的部分看作是类的定义。i m p l em en t a t i o n 的后面有一个空格,空格的后面是我们的类的名字C a t t l e,这是在告诉编译器,我们要定义C a t t l e类了。第 4行

50、和第1 3 行之间是我们在头文件里面定义的实体方法或者类方法的定义部分,当然我们的类如果没有任何的实体方法和类方法的话,我们也许要写上鲂m p l em en t a t i o n 和 1 1,把中间留为空就可以了。第 5行是我们定义的s a y S o m et h i n g的实现,我们可以发现第5行的内容和头文件C a t t l e,h的第7 行是一致的。笔者个人认为在编写实体方法和类方法的定义的时候,为了避免手工输入产生的误差,可以从头文件当中把声明的部分拷贝过来,然后删除掉分号,加上两个花括弧。我们知道地6行到第8行是方法的定义的部分,我们再来看看第7行。第 7行和第二章的H e

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁