Object-C入门教程大纲o开始吧下载这篇教学o设定环境o前言o编译helloworldo创建Classes@interfaceo@implementationo把它们凑在一起o详细说明...多重参数o建构子(Constructors)o访问权限oClasslevelaccesso异常情况(Exceptions)处理o继承、多型(Inheritance,Polymorphism)以及其他面向对象功能id型别o继承(Inheritance)o动态识别(Dynamictypes)oCategoriesoPosingoProtocolso内存管理RetainandRelease(保留与释放)oDeallocoAutoreleasePooloFoundationFrameworkClassesNSArrayoNSDictionary优点与缺点更多信息开始吧下载这篇教学所有这篇初学者指南的原始码都可以由objc.tar.gz下载。这篇教学中的许多范例都是由SteveKochan在ProgramminginObjective-C.一书中撰写。如果你想得到更多详细信息及范例,请直接参考该书。这个网站上登载的所有范例皆经过他的允许,所以请勿复制转载。设定环境Linux/FreeBSD:安装GNUStep为了编译GNUstep应用程序,必须先执行位于/usr/GNUstep/System/Makefiles/GNUstep.sh的GNUstep.sh这个档案。这个路径取决于你的系统环境,有些是在/usr,some/usr/lib,有些是/usr/local。如果你的shell是以csh/tcsh为基础的shell,则应该改用GNUStep.csh。建议把这个指令放在.bashrc或.cshrc中。MacOSX:安装XCodeWindowsNT5.X:安装cygwin或mingw,然后安装GNUStep前言这篇教学假设你已经有一些基本的C语言知识,包括C数据型别、什么是函式、什么是回传值、关于指针的知识以及基本的C语言内存管理。如果您没有这些背景知识,我非常建议你读一读K&R的书:TheCProgrammingLanguage(译注:台湾出版书名为C程序语言第二版)这是C语言的设计者所写的书。Objective-C,是C的衍生语言,继承了所有C语言的特性。是有一些例外,但是它们不是继承于C的语言特性本身。nil:在C/C++你或许曾使用过NULL,而在Objective-C中则是nil。不同之处是你可以传递讯息给nil(例如[nilmessage];),这是完全合法的,然而你却不能对NULL如法炮制。BOOL:C没有正式的布尔型别,而在Objective-C中也不是「真的」有。它是包含在Foundationclasses(基本类别库)中(即importNSObject.h;nil也是包括在这个头文件内)。BOOL在Objective-C中有两种型态:YES或NO,而不是TRUE或FALSE。#importvs#include:就如同你在helloworld范例中看到的,我们使用了#import。#import由gcc编译程序支援。我并不建议使用#include,#import基本上跟.h档头尾的#ifndef#define#endif相同。许多程序员们都同意,使用这些东西这是十分愚蠢的。无论如何,使用#import就对了。这样不但可以避免麻烦,而且万一有一天gcc把它拿掉了,将会有足够的Objective-C程序员可以坚持保留它或是将它放回来。偷偷告诉你,Apple在它们官方的程序代码中也使用了#import。所以万一有一天这种事真的发生,不难预料Apple将会提供一个支持#import的gcc分支版本。在Objective-C中,method及message这两个字是可以互换的。不过messages拥有特别的特性,一个message可以动态的转送给另一个对象。在Objective-C中,呼叫对象上的一个讯息并不一定表示对象真的会实作这个讯息,而是对象知道如何以某种方式去实作它,或是转送给知道如何实作的对象。编译helloworldhello.m#importstdio.hintmain(intargc,constchar*argv[]){printf(helloworld/n);return0;}o输出helloworldo在Objective-C中使用#import代替#includeObjective-C的预设扩展名是.m创建classes@interface基于ProgramminginObjective-C,Copyright©2004bySamsPublishing一书中的范例,并经过允许而刊载。Fraction.h#importFoundation/NSObject.h@interfaceFraction:NSObject{intnumerator;intdenominator;}-(void)print;-(void)setNumerator:(int)d;-(void)setDenominator:(int)d;-(int)numerator;-(int)denominator;@endoNSObject:NeXTStepObject的缩写。因为它已经改名为OpenStep,所以这在今天已经不是那么有意义了。继承(inheritance)以Class:Parent表示,就像上面的Fraction:NSObject。夹在@interfaceClass:Parent{....}中的称为instancevariables。没有设定访问权限(protected,public,private)时,预设的访问权限为protected。设定权限的方式将在稍后说明。Instancemethods跟在成员变数(即instancevariables)后。格式为:scope(returnType)methodName:(parameter1Type)parameter1Name;scope有class或instance两种。instancemethods以-开头,classlevelmethods以+开头。Interface以一个@end作为结束。@implementation基于ProgramminginObjective-C,Copyright©2004bySamsPublishing一书中的范例,并经过允许而刊载。Fraction.m#importFraction.h#importstdio.h@implementationFraction-(void)print{printf(%i/%i,numerator,denominator);}-(void)setNumerator:(int)n{numerator=n;}-(void)setDenominator:(int)d{denominator=d;}-(int)denominator{returndenominator;}-(int)numerator{returnnumerator;}@endoImplementation以@implementationClassName开始,以@end结束。Implement定义好的methods的方式,跟在interface中宣告时很近似。把它们凑在一起基于ProgramminginObjective-C,Copyright©2004bySamsPublishing一书中的范例,并经过允许而刊载。main.m#importstdio.h#importFraction.mintmain(intargc,constchar*argv[]){//createanewinstanceFraction*frac=[[Fractionalloc]init];//setthevalues[fracsetNumerator:1];[fracsetDenominator:3];//printitprintf(Thefractionis:);[fracprint];printf(/n);//freememory[fracrelease];return0;}ooutputThefractionis:1/3oFraction*frac=[[Fractionalloc]init];这行程序代码中有很多重要的东西。在Objective-C中呼叫methods的方法是[objectmethod],就像C++的object-method()。Objective-C没有value型别。所以没有像C++的Fractionfrac;frac.print();这类的东西。在Objective-C中完全使用指针来处理对象。这行程序代码实际上做了两件事:[Fractionalloc]呼叫了Fractionclass的allocmethod。这就像malloc内存,这个动作也做了一样的事情。[objectinit]是一个建构子(constructor)呼叫,负责初始化对象中的所有变量。它呼叫了[Fractionalloc]传回的instance上的initmethod。这个动作非常普遍,所以通常以一行程序完成:Object*var=[[Objectalloc]init];[fracsetNumerator:1]非常简单。它呼叫了frac上的setNumeratormethod并传入1为参数。如同每个C的变体,Objective-C也有一个用以释放内存的方式:release。它继承自NSObject,这个method在之后会有详尽的解说。详细说明...多重参数目前为止我还没展示如何传递多个参数。这个语法乍看之下不是很直觉,不过它却是来自一个十分受欢迎的Smalltalk版本。基于ProgramminginObjective-C,Copyright©2004bySamsPublishing一书中的范例,并经过允许而刊载。Fraction.h...-(void)setNumerator:(int)nandDenominator:(int)d;...oFraction.m...-(void)setNumerator:(int)nandDenominator:(int)d{numerator=n;denominator=d;}...omain.m#importstdio.h#importFraction.hintmain(intargc,constchar*argv[]){//createanewinstanceFraction*frac=[[Fractionalloc]init];Fraction*frac2=[[Fractionalloc]init];//setthevalues[fracsetNumerator:1];[fracsetDenominator:3];//combinedset[frac2setNumerator:1andDenominator:5];//printitprintf(Thefractionis:);[fracprint];printf(/n);//printitprintf(Fraction2is:);[frac2print];printf(/n);//freememory[fracrelease];[frac2release];return0;}ooutputThefractionis:1/3Fraction2is:1/5o这个method实际上叫做setNumerator:andDenominator:加入其他参数的方法就跟