爱问 爱问共享资料 爱问分类
首页 > > > Objective-C 第一版.pdf

Objective-C 第一版.pdf

Objective-C 第一版.pdf

上传者: 96agan
7次下载 0人收藏 暂无简介 简介 2011-06-25 举报

简介:objectiv c 中文版

Translations:English|Chinese大纲l开始吧下载这篇教学设定环境前言编译helloworldl创建Classes@interface@implementation把它们凑在一起l详细说明...多重参数建构子(Constructors)存取权限Classlevelaccess异常情况(Exceptions)处理l继承、多型(Inheritance,Polymorphism)以及其它对象导向功能id型别继承(Inheritance)动态识别(Dynamictypes)CategoriesPosingProtocolsl内存管理RetainandRelease(保留与释放)DeallocAutoreleasePoollFoundationFrameworkClassesNSArrayNSDictionaryl优点与缺点l更多信息开始吧o下载这篇教学n所有这篇初学者指南的原始码都可以由objc.tar.gz下载。这篇教学中的许多范例都是由SteveKochan在ProgramminginObjective-C.一书中撰写。如果你想得到更多详细信息及范例,请直接参考该书。这个网站上登载的所有范例皆经过他的允许,所以请勿复制转载。页码,1/43Objective-CBeginner'sGuide2008-2-6file://C:\DocumentsandSettings\Administrator\桌面\Objective-CBegi...PDFcreatedwithpdfFactoryProtrialversionwww.pdffactory.como设定环境nLinux/FreeBSD:安装GNUStepn为了编译GNUstep应用程序,必须先执行位于/usr/GNUstep/System/Makefiles/GNUstep.sh的GNUstep.sh这个档案。这个路径取决于你的系统环境,有些是在/usr,some/usr/lib,有些是/usr/local。如果你的shell是以csh/tcsh为基础的shell,则应该改用GNUStep.csh。建议把这个指令放在.bashrc或.cshrc中。nMacOSX:安装XCodenWindowsNT5.X:安装cygwin或mingw,然后安装GNUStepo前言n这篇教学假设你已经有一些基本的C语言知识,包括C数据型别、什么是函式、什么是回传值、关于指针的知识以及基本的C语言内存管理。如果您没有这些背景知识,我非常建议你读一读K&R的书:TheCProgrammingLanguage(译注:台湾出版书名为C程序语言第二版)这是C语言的设计者所写的书。nObjective-C,是C的衍生语言,继承了所有C语言的特性。是有一些例外,但是它们不是继承于C的语言特性本身。nnil:在C/C++你或许曾使用过NULL,而在Objective-C中则是nil。不同之处是你可以传递讯息给nil(例如[nilmessage];),这是完全合法的,然而你却不能对NULL如法炮制。nBOOL:C没有正式的布尔型别,而在Objective-C中也不是「真的」有。它是包含在Foundationclasses(基本类别库)中(即importNSObject.h;nil也是包括在这个标头档内)。BOOL在Objective-C中有两种型态:YES或NO,而不是TRUE或FALSE。n#importvs#include:就如同你在helloworld范例中看到的,我们使用了#import。#import由gcc编译器支持。我并不建议使用#include,#import基本上跟.h档头尾的#ifndef#define#endif相同。许多程序员们都同意,使用这些东西这是十分愚蠢的。无论如何,使用#import就对了。这样不但可以避免麻烦,而且万一有一天gcc把它拿掉了,将会有足够的Objective-C程序员可以坚持保留它或是将它放回来。偷偷告诉你,Apple在它们官方的程序代码中也使用了#import。所以万一有一天这种事真的发生,不难预料Apple将会提供一个支持#import的gcc分支版本。n在Objective-C中,method及message这两个字是可以互换的。不过messages拥有特别的特性,一个message可以动态的转送给另一个对象。在Objective-C中,呼叫对象上的一个讯息并不一定表示对象真的会实作这个讯息,而是对象知道如何以某种方式去实作它,或是转送给知道如何实作的对象。o编译helloworldnhello.m#import<stdio.h>intmain(intargc,constchar*argv[]){printf("helloworld\n");页码,2/43Objective-CBeginner'sGuide2008-2-6file://C:\DocumentsandSettings\Administrator\桌面\Objective-CBegi...PDFcreatedwithpdfFactoryProtrialversionwww.pdffactory.comreturn0;}n输出helloworldn在Objective-C中使用#import代替#includenObjective-C的预设扩展名是.m创建classeso@interfacen基于"ProgramminginObjective-C,"Copyright2004bySamsPublishing一书中的范例,并经过允许而刊载。nFraction.h#import<Foundation/NSObject.h>@interfaceFraction:NSObject{intnumerator;intdenominator;}-(void)print;-(void)setNumerator:(int)d;-(void)setDenominator:(int)d;-(int)numerator;-(int)denominator;@endnNSObject:NeXTStepObject的缩写。因为它已经改名为OpenStep,所以这在今天已经不是那么有意义了。n继承(inheritance)以Class:Parent表示,就像上面的Fraction:NSObject。n夹在@interfaceClass:Parent{....}中的称为instancevariables。n没有设定存取权限(protected,public,private)时,预设的存取权限为protected。设定权限的方式将在稍后说明。nInstancemethods跟在成员变数(即instancevariables)后。格式为:scope(returnType)methodName:(parameter1Type)parameter1Name;nscope有class或instance两种。instancemethods以-开头,classlevelmethods以+开头。nInterface以一个@end作为结束。o@implementationn基于"ProgramminginObjective-C,"Copyright2004bySamsPublishing一书中页码,3/43Objective-CBeginner'sGuide2008-2-6file://C:\DocumentsandSettings\Administrator\桌面\Objective-CBegi...PDFcreatedwithpdfFactoryProtrialversionwww.pdffactory.com的范例,并经过允许而刊载。nFraction.m#import"Fraction.h"#import<stdio.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;}@endnImplementation以@implementationClassName开始,以@end结束。nImplement定义好的methods的方式,跟在interface中宣告时很近似。o把它们凑在一起n基于"ProgramminginObjective-C,"Copyright2004bySamsPublishing一书中的范例,并经过允许而刊载。nmain.m#import<stdio.h>#import"Fraction.h"intmain(intargc,constchar*argv[]){//createanewinstanceFraction*frac=[[Fractionalloc]init];//setthevalues[fracsetNumerator:1];[fracsetDenominator:3];//printitprintf("Thefractionis:");页码,4/43Objective-CBeginner'sGuide2008-2-6file://C:\DocumentsandSettings\Administrator\桌面\Objective-CBegi...PDFcreatedwithpdfFactoryProtrialversionwww.pdffactory.com[fracprint];printf("\n");//freememory[fracrelease];return0;}noutputThefractionis:1/3nFraction*frac=[[Fractionalloc]init];n这行程序代码中有很多重要的东西。n在Objective-C中呼叫methods的方法是[objectmethod],就像C++的object->method()。nObjective-C没有value型别。所以没有像C++的Fractionfrac;frac.print();这类的东西。在Objective-C中完全使用指针来处理对象。n这行程序代码实际上做了两件事:[Fractionalloc]呼叫了Fractionclass的allocmethod。这就像malloc内存,这个动作也做了一样的事情。n[objectinit]是一个建构子(constructor)呼叫,负责初始化对象中的所有变量。它呼叫了[Fractionalloc]传回的instance上的initmethod。这个动作非常普遍,所以通常以一行程序完成:Object*var=[[Objectalloc]init];n[fracsetNumerator:1]非常简单。它呼叫了frac上的setNumeratormethod并传入1为参数。n如同每个C的变体,Objective-C也有一个用以释放内存的方式:release。它继承自NSObject,这个method在之后会有详尽的解说。详细说明...o多重参数n目前为止我还没展示如何传递多个参数。这个语法乍看之下不是很直觉,不过它却是来自一个十分受欢迎的Smalltalk版本。n基于"ProgramminginObjective-C,"Copyright2004bySamsPublishing一书中的范例,并经过允许而刊载。nFraction.h...-(void)setNumerator:(int)nandDenominator:(int)d;...nFraction.m...-(void)setNumerator:(int)nandDenominator:(int)d{页码,5/43Objective-CBeginner'sGuide2008-2-6file://C:\DocumentsandSettings\Administrator\桌面\Objective-CBegi...PDFcreatedwithpdfFactoryProtrialversionwww.pdffactory.comnumerator=n;denominator=d;}...nmain.m#import<stdio.h>#import"Fraction.h"intmain(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;}noutputThefractionis:1/3Fraction2is:1/5n这个method实际上叫做setNumerator:andDenominator:n加入其它参数的方法就跟加入第二个时一样,即method:label1:label2:label3:,而呼叫的方法是[objmethod:param1label1:param2label2:param3label3:param4]nLabels是非必要的,所以可以有一个像这样的method:method:::,简单的省页码,6/43Objective-CBeginner'sGuide2008-2-6file://C:\DocumentsandSettings\Administrator\桌面\Objective-CBegi...PDFcreatedwithpdfFactoryProtrialversionwww.pdffactory.com略label名称,但以:区隔参数。并不建议这样使用。o建构子(Constructors)n基于"ProgramminginObjective-C,"Copyright2004bySamsPublishing一书中的范例,并经过允许而刊载。nFraction.h...-(Fraction*)initWithNumerator:(int)ndenominator:(int)d;...nFraction.m...-(Fraction*)initWithNumerator:(int)ndenominator:(int)d{self=[superinit];if(self){[selfsetNumerator:nandDenominator:d];}returnself;}...nmain.m#import<stdio.h>#import"Fraction.h"intmain(intargc,constchar*argv[]){//createanewinstanceFraction*frac=[[Fractionalloc]init];Fraction*frac2=[[Fractionalloc]init];Fraction*frac3=[[Fractionalloc]initWithNumerator:3denominator:10];//setthevalues[fracsetNumerator:1];[fracsetDenominator:3];//combinedset[frac2setNumerator:1andDenominator:5];//printitprintf("Thefractionis:");[fracprint];printf("\n");printf("Fraction2is:");页码,7/43Objective-CBeginner'sGuide2008-2-6file://C:\DocumentsandSettings\Administrator\桌面\Objective-CBegi...PDFcreatedwithpdfFactoryProtrialversionwww.pdffactory.com[frac2print];printf("\n");printf("Fraction3is:");[frac3print];printf("\n");//freememory[fracrelease];[frac2release];[frac3release];return0;}noutputThefractionis:1/3Fraction2is:1/5Fraction3is:3/10n@interface里的宣告就如同正常的函式。n@implementation使用了一个新的关键词:supern如同Java,Objective-C只有一个parentclass(父类别)。n使用[superinit]来存取Superconstructor,这个动作需要适当的继承设计。n你将这个动作回传的instance指派给另一新个关键词:self。Self很像C++与Java的this指标。nif(self)跟(self!=nil)一样,是为了确定superconstructor成功传回了一个新对象。nil是Objective-C用来表达C/C++中NULL的方式,可以引入NSObject来取得。n当你初始化变量以后,你用传回self的方式来传回自己的地址。n预设的建构子是-(id)init。n技术上来说,Objective-C中的建构子就是一个"init"method,而不像C++与Java有特殊的结构。o存取权限n预设的权限是@protectednJava实作的方式是在methods与变量前面加上public/private/protected修饰语,而Objective-C的作法则更像C++对于instancevariable(译注:C++术语一般称为datamembers)的方式。nAccess.h#import<Foundation/NSObject.h>@interfaceAccess:NSObject{@publicintpublicVar;页码,8/43Objective-CBeginner'sGuide2008-2-6file://C:\DocumentsandSettings\Administrator\桌面\Objective-CBegi...PDFcreatedwithpdfFactoryProtrialversionwww.pdffactory.com@privateintprivateVar;intprivateVar2;@protectedintprotectedVar;}@endnAccess.m#import"Access.h"@implementationAccess@endnmain.m#import"Access.h"#import<stdio.h>intmain(intargc,constchar*argv[]){Access*a=[[Accessalloc]init];//worksa->publicVar=5;printf("publicvar:%i\n",a->publicVar);//doesn'tcompile//a->privateVar=10;//printf("privatevar:%i\n",a->privateVar);[arelease];return0;}noutputpublicvar:5n如同你所看到的,就像C++中private:[listofvars]public:[listofvars]的格式,它只是改成了@private,@protected,等等。oClasslevelaccessn当你想计算一个对象被instance几次时,通常有classlevelvariables以及classlevelfunctions是件方便的事。nClassA.h#import<Foundation/NSObject.h>页码,9/43Objective-CBeginner'sGuide2008-2-6file://C:\DocumentsandSettings\Administrator\桌面\Objective-CBegi...PDFcreatedwithpdfFactoryProtrialversionwww.pdffactory.comstaticintcount;@interfaceClassA:NSObject+(int)initCount;+(void)initialize;@endnClassA.m#import"ClassA.h"@implementationClassA-(id)init{self=[superinit];count++;returnself;}+(int)initCount{returncount;}+(void)initialize{count=0;}@endnmain.m#import"ClassA.h"#import<stdio.h>intmain(intargc,constchar*argv[]){ClassA*c1=[[ClassAalloc]init];ClassA*c2=[[ClassAalloc]init];//printcountprintf("ClassAcount:%i\n",[ClassAinitCount]);ClassA*c3=[[ClassAalloc]init];//printcountagainprintf("ClassAcount:%i\n",[ClassAinitCount]);[c1release];[c2release];[c3release];return0;页码,10/43Objective-CBeginner'sGuide2008-2-6file://C:\DocumentsandSettings\Administrator\桌面\Objective-CBegi...PDFcreatedwithpdfFactoryProtrialversionwww.pdffactory.com}noutputClassAcount:2ClassAcount:3nstaticintcount=0;这是classvariable宣告的方式。其实这种变量摆在这里并不理想,比较好的解法是像Java实作staticclassvariables的方法。然而,它确实能用。n+(int)initCount;这是回传count值的实际method。请注意这细微的差别!这里在type前面不用减号-而改用加号+。加号+表示这是一个classlevelfunction。(译注:许多文件中,classlevelfunctions被称为classfunctions或classmethod)n存取这个变数跟存取一般成员变数没有两样,就像ClassA中的count++用法。n+(void)initializemethodis在Objective-C开始执行你的程序时被呼叫,而且它也被每个class呼叫。这是初始化像我们的count这类classlevelvariables的好地方。o异常情况(Exceptions)n注意:异常处理只有MacOSX10.3以上才支持。n基于"ProgramminginObjective-C,"Copyright2004bySamsPublishing一书中的范例,并经过允许而刊载。nCupWarningException.h#import<Foundation/NSException.h>@interfaceCupWarningException:NSException@endnCupWarningException.m#import"CupWarningException.h"

Objective-C 第一版.pdf

Objective-C 第一版.pdf

上传者: 96agan
7次下载 0人收藏 暂无简介 简介 2011-06-25 举报

简介:objectiv c 中文版

Translations:English|Chinese大纲l开始吧下载这篇教学设定环境前言编译helloworldl创建Classes@interface@implementation把它们凑在一起l详细说明...多重参数建构子(Constructors)存取权限Classlevelaccess异常情况(Exceptions)处理l继承、多型(Inheritance,Polymorphism)以及其它对象导向功能id型别继承(Inheritance)动态识别(Dynamictypes)CategoriesPosingProtocolsl内存管理RetainandRelease(保留与释放)DeallocAutoreleasePoollFoundationFrameworkClassesNSArrayNSDictionaryl优点与缺点l更多信息开始吧o下载这篇教学n所有这篇初学者指南的原始码都可以由objc.tar.gz下载。这篇教学中的许多范例都是由SteveKochan在ProgramminginObjective-C.一书中撰写。如果你想得到更多详细信息及范例,请直接参考该书。这个网站上登载的所有范例皆经过他的允许,所以请勿复制转载。页码,1/43Objective-CBeginner'sGuide2008-2-6file://C:\DocumentsandSettings\Administrator\桌面\Objective-CBegi...PDFcreatedwithpdfFactoryProtrialversionwww.pdffactory.como设定环境nLinux/FreeBSD:安装GNUStepn为了编译GNUstep应用程序,必须先执行位于/usr/GNUstep/System/Makefiles/GNUstep.sh的GNUstep.sh这个档案。这个路径取决于你的系统环境,有些是在/usr,some/usr/lib,有些是/usr/local。如果你的shell是以csh/tcsh为基础的shell,则应该改用GNUStep.csh。建议把这个指令放在.bashrc或.cshrc中。nMacOSX:安装XCodenWindowsNT5.X:安装cygwin或mingw,然后安装GNUStepo前言n这篇教学假设你已经有一些基本的C语言知识,包括C数据型别、什么是函式、什么是回传值、关于指针的知识以及基本的C语言内存管理。如果您没有这些背景知识,我非常建议你读一读K&R的书:TheCProgrammingLanguage(译注:台湾出版书名为C程序语言第二版)这是C语言的设计者所写的书。nObjective-C,是C的衍生语言,继承了所有C语言的特性。是有一些例外,但是它们不是继承于C的语言特性本身。nnil:在C/C++你或许曾使用过NULL,而在Objective-C中则是nil。不同之处是你可以传递讯息给nil(例如[nilmessage];),这是完全合法的,然而你却不能对NULL如法炮制。nBOOL:C没有正式的布尔型别,而在Objective-C中也不是「真的」有。它是包含在Foundationclasses(基本类别库)中(即importNSObject.h;nil也是包括在这个标头档内)。BOOL在Objective-C中有两种型态:YES或NO,而不是TRUE或FALSE。n#importvs#include:就如同你在helloworld范例中看到的,我们使用了#import。#import由gcc编译器支持。我并不建议使用#include,#import基本上跟.h档头尾的#ifndef#define#endif相同。许多程序员们都同意,使用这些东西这是十分愚蠢的。无论如何,使用#import就对了。这样不但可以避免麻烦,而且万一有一天gcc把它拿掉了,将会有足够的Objective-C程序员可以坚持保留它或是将它放回来。偷偷告诉你,Apple在它们官方的程序代码中也使用了#import。所以万一有一天这种事真的发生,不难预料Apple将会提供一个支持#import的gcc分支版本。n在Objective-C中,method及message这两个字是可以互换的。不过messages拥有特别的特性,一个message可以动态的转送给另一个对象。在Objective-C中,呼叫对象上的一个讯息并不一定表示对象真的会实作这个讯息,而是对象知道如何以某种方式去实作它,或是转送给知道如何实作的对象。o编译helloworldnhello.m#import<stdio.h>intmain(intargc,constchar*argv[]){printf("helloworld\n");页码,2/43Objective-CBeginner'sGuide2008-2-6file://C:\DocumentsandSettings\Administrator\桌面\Objective-CBegi...PDFcreatedwithpdfFactoryProtrialversionwww.pdffactory.comreturn0;}n输出helloworldn在Objective-C中使用#import代替#includenObjective-C的预设扩展名是.m创建classeso@interfacen基于"ProgramminginObjective-C,"Copyright2004bySamsPublishing一书中的范例,并经过允许而刊载。nFraction.h#import<Foundation/NSObject.h>@interfaceFraction:NSObject{intnumerator;intdenominator;}-(void)print;-(void)setNumerator:(int)d;-(void)setDenominator:(int)d;-(int)numerator;-(int)denominator;@endnNSObject:NeXTStepObject的缩写。因为它已经改名为OpenStep,所以这在今天已经不是那么有意义了。n继承(inheritance)以Class:Parent表示,就像上面的Fraction:NSObject。n夹在@interfaceClass:Parent{....}中的称为instancevariables。n没有设定存取权限(protected,public,private)时,预设的存取权限为protected。设定权限的方式将在稍后说明。nInstancemethods跟在成员变数(即instancevariables)后。格式为:scope(returnType)methodName:(parameter1Type)parameter1Name;nscope有class或instance两种。instancemethods以-开头,classlevelmethods以+开头。nInterface以一个@end作为结束。o@implementationn基于"ProgramminginObjective-C,"Copyright2004bySamsPublishing一书中页码,3/43Objective-CBeginner'sGuide2008-2-6file://C:\DocumentsandSettings\Administrator\桌面\Objective-CBegi...PDFcreatedwithpdfFactoryProtrialversionwww.pdffactory.com的范例,并经过允许而刊载。nFraction.m#import"Fraction.h"#import<stdio.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;}@endnImplementation以@implementationClassName开始,以@end结束。nImplement定义好的methods的方式,跟在interface中宣告时很近似。o把它们凑在一起n基于"ProgramminginObjective-C,"Copyright2004bySamsPublishing一书中的范例,并经过允许而刊载。nmain.m#import<stdio.h>#import"Fraction.h"intmain(intargc,constchar*argv[]){//createanewinstanceFraction*frac=[[Fractionalloc]init];//setthevalues[fracsetNumerator:1];[fracsetDenominator:3];//printitprintf("Thefractionis:");页码,4/43Objective-CBeginner'sGuide2008-2-6file://C:\DocumentsandSettings\Administrator\桌面\Objective-CBegi...PDFcreatedwithpdfFactoryProtrialversionwww.pdffactory.com[fracprint];printf("\n");//freememory[fracrelease];return0;}noutputThefractionis:1/3nFraction*frac=[[Fractionalloc]init];n这行程序代码中有很多重要的东西。n在Objective-C中呼叫methods的方法是[objectmethod],就像C++的object->method()。nObjective-C没有value型别。所以没有像C++的Fractionfrac;frac.print();这类的东西。在Objective-C中完全使用指针来处理对象。n这行程序代码实际上做了两件事:[Fractionalloc]呼叫了Fractionclass的allocmethod。这就像malloc内存,这个动作也做了一样的事情。n[objectinit]是一个建构子(constructor)呼叫,负责初始化对象中的所有变量。它呼叫了[Fractionalloc]传回的instance上的initmethod。这个动作非常普遍,所以通常以一行程序完成:Object*var=[[Objectalloc]init];n[fracsetNumerator:1]非常简单。它呼叫了frac上的setNumeratormethod并传入1为参数。n如同每个C的变体,Objective-C也有一个用以释放内存的方式:release。它继承自NSObject,这个method在之后会有详尽的解说。详细说明...o多重参数n目前为止我还没展示如何传递多个参数。这个语法乍看之下不是很直觉,不过它却是来自一个十分受欢迎的Smalltalk版本。n基于"ProgramminginObjective-C,"Copyright2004bySamsPublishing一书中的范例,并经过允许而刊载。nFraction.h...-(void)setNumerator:(int)nandDenominator:(int)d;...nFraction.m...-(void)setNumerator:(int)nandDenominator:(int)d{页码,5/43Objective-CBeginner'sGuide2008-2-6file://C:\DocumentsandSettings\Administrator\桌面\Objective-CBegi...PDFcreatedwithpdfFactoryProtrialversionwww.pdffactory.comnumerator=n;denominator=d;}...nmain.m#import<stdio.h>#import"Fraction.h"intmain(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;}noutputThefractionis:1/3Fraction2is:1/5n这个method实际上叫做setNumerator:andDenominator:n加入其它参数的方法就跟加入第二个时一样,即method:label1:label2:label3:,而呼叫的方法是[objmethod:param1label1:param2label2:param3label3:param4]nLabels是非必要的,所以可以有一个像这样的method:method:::,简单的省页码,6/43Objective-CBeginner'sGuide2008-2-6file://C:\DocumentsandSettings\Administrator\桌面\Objective-CBegi...PDFcreatedwithpdfFactoryProtrialversionwww.pdffactory.com略label名称,但以:区隔参数。并不建议这样使用。o建构子(Constructors)n基于"ProgramminginObjective-C,"Copyright2004bySamsPublishing一书中的范例,并经过允许而刊载。nFraction.h...-(Fraction*)initWithNumerator:(int)ndenominator:(int)d;...nFraction.m...-(Fraction*)initWithNumerator:(int)ndenominator:(int)d{self=[superinit];if(self){[selfsetNumerator:nandDenominator:d];}returnself;}...nmain.m#import<stdio.h>#import"Fraction.h"intmain(intargc,constchar*argv[]){//createanewinstanceFraction*frac=[[Fractionalloc]init];Fraction*frac2=[[Fractionalloc]init];Fraction*frac3=[[Fractionalloc]initWithNumerator:3denominator:10];//setthevalues[fracsetNumerator:1];[fracsetDenominator:3];//combinedset[frac2setNumerator:1andDenominator:5];//printitprintf("Thefractionis:");[fracprint];printf("\n");printf("Fraction2is:");页码,7/43Objective-CBeginner'sGuide2008-2-6file://C:\DocumentsandSettings\Administrator\桌面\Objective-CBegi...PDFcreatedwithpdfFactoryProtrialversionwww.pdffactory.com[frac2print];printf("\n");printf("Fraction3is:");[frac3print];printf("\n");//freememory[fracrelease];[frac2release];[frac3release];return0;}noutputThefractionis:1/3Fraction2is:1/5Fraction3is:3/10n@interface里的宣告就如同正常的函式。n@implementation使用了一个新的关键词:supern如同Java,Objective-C只有一个parentclass(父类别)。n使用[superinit]来存取Superconstructor,这个动作需要适当的继承设计。n你将这个动作回传的instance指派给另一新个关键词:self。Self很像C++与Java的this指标。nif(self)跟(self!=nil)一样,是为了确定superconstructor成功传回了一个新对象。nil是Objective-C用来表达C/C++中NULL的方式,可以引入NSObject来取得。n当你初始化变量以后,你用传回self的方式来传回自己的地址。n预设的建构子是-(id)init。n技术上来说,Objective-C中的建构子就是一个"init"method,而不像C++与Java有特殊的结构。o存取权限n预设的权限是@protectednJava实作的方式是在methods与变量前面加上public/private/protected修饰语,而Objective-C的作法则更像C++对于instancevariable(译注:C++术语一般称为datamembers)的方式。nAccess.h#import<Foundation/NSObject.h>@interfaceAccess:NSObject{@publicintpublicVar;页码,8/43Objective-CBeginner'sGuide2008-2-6file://C:\DocumentsandSettings\Administrator\桌面\Objective-CBegi...PDFcreatedwithpdfFactoryProtrialversionwww.pdffactory.com@privateintprivateVar;intprivateVar2;@protectedintprotectedVar;}@endnAccess.m#import"Access.h"@implementationAccess@endnmain.m#import"Access.h"#import<stdio.h>intmain(intargc,constchar*argv[]){Access*a=[[Accessalloc]init];//worksa->publicVar=5;printf("publicvar:%i\n",a->publicVar);//doesn'tcompile//a->privateVar=10;//printf("privatevar:%i\n",a->privateVar);[arelease];return0;}noutputpublicvar:5n如同你所看到的,就像C++中private:[listofvars]public:[listofvars]的格式,它只是改成了@private,@protected,等等。oClasslevelaccessn当你想计算一个对象被instance几次时,通常有classlevelvariables以及classlevelfunctions是件方便的事。nClassA.h#import<Foundation/NSObject.h>页码,9/43Objective-CBeginner'sGuide2008-2-6file://C:\DocumentsandSettings\Administrator\桌面\Objective-CBegi...PDFcreatedwithpdfFactoryProtrialversionwww.pdffactory.comstaticintcount;@interfaceClassA:NSObject+(int)initCount;+(void)initialize;@endnClassA.m#import"ClassA.h"@implementationClassA-(id)init{self=[superinit];count++;returnself;}+(int)initCount{returncount;}+(void)initialize{count=0;}@endnmain.m#import"ClassA.h"#import<stdio.h>intmain(intargc,constchar*argv[]){ClassA*c1=[[ClassAalloc]init];ClassA*c2=[[ClassAalloc]init];//printcountprintf("ClassAcount:%i\n",[ClassAinitCount]);ClassA*c3=[[ClassAalloc]init];//printcountagainprintf("ClassAcount:%i\n",[ClassAinitCount]);[c1release];[c2release];[c3release];return0;页码,10/43Objective-CBeginner'sGuide2008-2-6file://C:\DocumentsandSettings\Administrator\桌面\Objective-CBegi...PDFcreatedwithpdfFactoryProtrialversionwww.pdffactory.com}noutputClassAcount:2ClassAcount:3nstaticintcount=0;这是classvariable宣告的方式。其实这种变量摆在这里并不理想,比较好的解法是像Java实作staticclassvariables的方法。然而,它确实能用。n+(int)initCount;这是回传count值的实际method。请注意这细微的差别!这里在type前面不用减号-而改用加号+。加号+表示这是一个classlevelfunction。(译注:许多文件中,classlevelfunctions被称为classfunctions或classmethod)n存取这个变数跟存取一般成员变数没有两样,就像ClassA中的count++用法。n+(void)initializemethodis在Objective-C开始执行你的程序时被呼叫,而且它也被每个class呼叫。这是初始化像我们的count这类classlevelvariables的好地方。o异常情况(Exceptions)n注意:异常处理只有MacOSX10.3以上才支持。n基于"ProgramminginObjective-C,"Copyright2004bySamsPublishing一书中的范例,并经过允许而刊载。nCupWarningException.h#import<Foundation/NSException.h>@interfaceCupWarningException:NSException@endnCupWarningException.m#import"CupWarningException.h"
  • 相关资料
  • 该用户的其他资料
  • 名称/格式
  • 下载次数
  • 资料大小
  • 名称/格式
  • 下载次数
  • 资料大小

空空如也,TA还未上传其他资料~ ~

用户评论

0/200
暂无评论
上传我的资料
关闭

请选择举报的类型

关闭

提示

提交成功!

感谢您对爱问共享资料的支持,我们将尽快核实并处理您的举报信息。

关闭

提示

提交失败!

您的举报信息提交失败,请重试!

关闭

提示

重复举报!

亲爱的用户!感觉您对爱问共享资料的支持,请勿重复举报噢!

全屏 缩小 放大
收藏
资料评价:

/ 43
所需积分:1 立即下载
返回
顶部
举报
资料
关闭

温馨提示

感谢您对爱问共享资料的支持,精彩活动将尽快为您呈现,敬请期待!