您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > ObjectC的语法与Cocoa框架V1.0
Object-C的的的的语法语法语法语法与与与与Cocoa框架框架框架框架李海峰QQ:61673110邮箱:andrew830314@163.comObject-C是苹果MacOSX、iOS平台的开发语言,Object-C基于C语言的,增加面向对象的相关特性。你可以认为Object-C就是另一个版本的C++,也就是它采用了与C++不同的语法,但也实现了面向对象。NextStep是一个使用Object-C语言编写的功能强大的工具包,里面有大量的类库、结构体等,被苹果收购之后,更名为Cocoa,但是苹果并未更改NextStep中的类库名称,因此你会看到大量的以NS为前缀的类名、结构体、枚举等。在Object-C中使用前缀可以有效的防止名称冲突。Cocoa框架由FoundationKit、AppKit两部分组成,前者是基础工具库,是你必须首先要学会的,后者主要是UI库、高级对象等,我们这里只介绍FoundationKit。本文档使用Windows上的GNUStep作为Object-C的编译器,不支持Object-C2.0的相关新特性,但基本完全支持Cocoa的FoundationKit、AppKit工具库。1.GNUStep的安装的安装的安装的安装::::首先前往网址,下载文件:然后按照下面的顺序安装这四个文件到同一个目录(例如:C:\GNUstep):(1.)gnustep-msys-system-xxx.exe(2.)gnustep-core-xxx.exe(3.)gnustep-devel-xxx.exe(4.)gnustep-cairo-xxx.exe安装完成后,进入开始---程序---GNUStep---Shell,你会看到一个在Windows上打开的命令行窗口,你可以在其中使用Linux的Shell命令cd、ls、rm等进行操作。启动Shell之后,它会在GNUStep的目录中建一个/home/xxx/的文件夹,xxx为你当前登陆Windows系统的用户名称,Shell默认进入的就是这个目录,也就是Linux上的cd~。你可以在Shell中使用vi命令创建Object-C的源文件,但是推荐的方式是使用UltraEdit等编辑器编辑Object-C的源文件,然后在Shell中编译、运行。GNUStep使用GCC编译器,编译Object-C的命令:gcc-ohello.exehello.m-I/GNUstep/System/Library/Headers-fconstant-string-class=NSConstantString-L/GNUstep/System/Library/Libraries-lobjc-lgnustep-base(1.)红色部分为编译生成的可运行文件,蓝色部分为要编译的源文件,可以有多个,使用空格分隔。(2.)参数-I表示头文件查找的路径,-L表示库文件查找路径,-l表示需要链接的库文件,-fconstant-string-class=NSConstantString主要是指定常量字符串所使用的class。2.类定义类定义类定义类定义::::我们定义一个类,这个类完成的功能是使用两个int类型的数字组成一个分数。在Object-C中必须首先定义一个接口,该接口用于描述这个类的组成,包含成员变量、类变量、类方法、成员方法。接口文件的扩展名为h,也就是定义为C语言中的头文件。Fraction.h#importFoundation/Foundation.hstaticintt=0;@interfaceFraction:NSObject{intnumerator;//分子@publicintdenominator;//分母}-(void)setNumerator:(int)numerator;//numerator的setter方法-(void)setDenominator:(int)denominator;//denominator的setter方法-(void)setNumerator:(int)numeratorandDenominator:(int)denominator;//一个同时设置两个成员变量的快捷方法-(int)numerator;//numerator的getter方法-(int)denominator;//denominator的getter方法-(void)print;+(void)t;@end一个Object-C中的接口就是C语言中的一个header文件,这个文件结构如下所示:#importHeaderstatic类型变量名;@interface接口名:父类名称{访问修饰符类型变量名;……}-(返回值类型)方法名:(参数类型)参数名标签1:(参数类型)参数名……+(返回值类型)方法名:(参数类型)参数名标签1:(参数类型)参数名……@end我们来逐行看一下上面的内容:(1.)这里与C语言不同的是导入头文件使用的是import,而不是include。另外与C语言一样的地方是如果你想从当前目录查找Header文件,找不到就到系统的头文件库中查找,请使用#import“Header文件”,如果你只想从系统的头文件库中查找,请使用#importHeader文件。Foundation/Foundation.h包含了FoundationKit中的所有的头文件定义,GNUStep的Object-C的Foundation头文件在\GNUStep安装目录\GNUstep\System\Library\Headers\Foundation文件夹。GNUStep的Object-C的AppKit头文件在\GNUStep安装目录\GNUstep\System\Library\Headers\AppKit文件夹。(2.)static标识的类变量定义在接口的外面,类变量只能本类访问,除非提供类方法给外部访问这个类变量。(3.)Object-C中的@+指令表示C语言之外的Object-C的衍生语法,因此@interface表示定义了一个接口,接口名称之后紧跟了一个冒号,冒号后是父类的名字,Object-C中的顶级父类是NSObject。(4.)接口定义之后紧接着一对{},其中定义了成员变量,所谓的成员变量就相当于JAVA中的实例变量,从属于类的对象。Object-C中的成员变量使用@public、@protected、@private作为访问修饰符,默认是@protected。这里你要知道的是Object-C中只有成员变量有访问修饰符,类变量、类方法、成员方法是没有访问修饰符的,所有的方法都是public的,所有的类变量都是私有的。(5.)以-开头的方法为成员方法,以+开头的方法为类方法,方法中的类型描述(返回值类型、参数类型)都必须使用()包围。如果方法有多个参数,每个参数都有一个标签名(可以省略,但不建议这样做),每个标签名之后使用冒号与参数描述分隔。在有多个参数的方法中,实际的方法名称为方法名方法名方法名方法名:标签名标签名标签名标签名1:标签名标签名标签名标签名2:……,上面的拥有两个参数的方法的方法名为setNumerator:andDenominator:。与JAVA不同的是Object-C中的类方法只能类调用,如果你使用对象调用会报错,而JAVA仅仅是在编译期给出警告。(6.)以@end表示接口定义结束。这是因为与JAVA不同的是JAVA的类型定义使用{}包围,而Object-C中的{}只包围成员变量,因此必须有个结束标志,一般JAVA程序员经常会忘记写这个结束标记。这里你要知道Object-C的@interface与JAVA的interface并不是一回事儿,后面你会看到Object-C中的@protocol与JAVA中的interface才是等同的。这里你只需要记住的是Object-C中的@interface只是类的一个描述,因为@interface通常在独立的h文件中,你可以把它类比成C语言中的函数原型,也就是在Object-C里应该叫做类的原型。通过这个原型,编译器可以知道具体实现类有哪些功能。上面的接口中的方法很简单,主要就是成员变量的setter、getter方法,这与JAVA没有什么不同的。但是你会发现getter方法没有以get作为方法名称前缀,这是因为get开头的方法在Object-C中有着特殊的含义,这在后面将会看到。下面我们编写实现类,Object-C的类文件使用扩展名m。Fraction.m#importFraction.h@implementationFraction-(void)setNumerator:(int)n{numerator=n;}-(void)setDenominator:(int)d{denominator=d;}-(void)setNumerator:(int)nandDenominator:(int)d{numerator=n;denominator=d;}-(int)numerator{returnnumerator;}-(int)denominator{returndenominator;}-(void)print{printf(%d/%d\n,numerator,denominator);}-(void)m{printf(-m:Theclassvariabletis%d\n,++t);}+(void)t{printf(+t:Theclassvariabletis%d\n,++t);}@end因为我们将Fraction.m与Fraction.h放在一个文件夹下面,所以#import使用了””,这个类的任务就是实现接口中的方法,因此与接口的结构不同的地方就是,你不能在这里定义变量,@interface换成了@implementation,其余就没有什么特别的了。你不必在这里实现@interface中的全部方法,这不会导致错误。这里有个-(void)m方法比较特别,我们并没有在@interface中声明,那么这个方法可以调用吗?因为Object-C是动态语言,即便是@interface中没有定义的方法,依然可以被调用。另外,你需要注意的是setter方法与接口中不同的是参数名缩写成了n、d,这是因为在方法中,本地变量(参数、方法中定义的变量)在名称冲突的情况下,会隐藏成员变量,因此导致numerator=numerator变成了无意义的操作。当然你可以使用后面提到的self关键字,写成self-numerator=numerator,也就是JAVA中的常用的this.x=x的写法。下面我们编写调用代码,因为Object-C基于C语言,所以程序的入口依然是main函数。这里注意#import的是h,不是m。main.m#importFraction.hintmain(intargc,constchar*argv[]){Fraction*frac=[[Fractionalloc]init];[fracsetNumerator:3andDenominator:5];[fracprint];printf(ThedenominatorofFractionis%d\n,frac-denominator);[Fractiont];//调用类方法[fracm];[fracrelease];return0;}(1.)第一行我们创建了Fraction的实例(对象),Object-C中实例只能使用指针作为变量,而不能使用值,所以你看到了*frac,而不是frac,这与JAVA是一致的,JAVA中的指向实例的变量(JAVA中叫做引用)也是指针,只不过JAVA中没有指针的概念,所以你没有看到*。至于等号右侧的创建实例的代码,你可以在下面看到,这里先不用理会。(2.)第二行代码调用同时设置两个变量的方法,我们看到Object-C的调用方法的语法格式为[类或者
本文标题:ObjectC的语法与Cocoa框架V1.0
链接地址:https://www.777doc.com/doc-6317194 .html