先看看相关术语:
1.类(class)是一种表示对象需要运行的代码。对象通过它的类来获取自身的各种信息,尤其是执行每个操作需要运行的代码。简单的程序可能仅包含少量的类,中等复杂的程序会包含十几个类。建议开发人员在使用Objective-C编程时采用首字母大写类名。
2.对象(object)是一种包含值和指向其类的隐藏指针的结构体。运行中的程序通常都包含成百上千个对象。指向对象的变量通常不需要首字母大写。
3.实例(instance)是“对象”的另一种称呼。比如说circle对象也可以成为Circle类的实例。
4.消息(message)是对象可执行的操作,用于通知对象去做什么。对象接收消息后,将查询相应的类,以便找到正确的代码来运行。
5.方法(method)是为响应消息而运行的代码。根据对象的类,消息可以调用不同的方法。
6.方法调度(method dispatcher)是Objective-C的使用的一种机制,用于推测执行什么方法以响应某个特定的消息。
7.接口(interface)是类为对象提供的特性描述
8.实现(implementation)是接口能正常工作的代码。
一、@interface部分
创建某个特定类的对象之前,Objective-C编译器需要一些相关的信息,尤其是对象的数据成员(即对象的C语言类结构体应该是什么样子)及其提供的功能。可以使用@interface指令把这些消息传递给编译器。
以下是Circle类的接口。
@interface Circle :NSObject
{
@private
ShapeColor fillColor;
ShapeRect bounds;
}
- (void) setFillColor: (ShapeColor) fillColor;
- (void) setBounds: (ShapeRect) bounds;
- (void) draw;
@end
第一行 @interface Circle :NSObject
在Objective-C中只要看见@符号就可以把它看成是对C语言的扩展。@interface Circle告诉编译器:这是新类Circle的接口。
@interface行中的NSObject告诉编译器,Circle类是基于NSObject类的。该语句表明每个Circle类都是一个NSObject,并且每个Circle类都将继承NSObject类定义的所有行为。
在声明玩新类之后,我们将告诉编译器Circle对象需要的各种数据成员。
{
ShapeColor fillColor;
ShapeRect bounds;
}
第一个元素是fillColor,属于ShapeColor类型。第二个元素是bounds,属于ShaperRect类型。
在类声明中指定fillColor和bounds后,每次创建Circle对象,对象中都将包括这两个元素。因此,每个Circle类对象都将拥有自己的fillColor和bounds。fillColor和bounds的值称为Circle类的实例变量(instance variable)。
结尾处的花括号告诉编译器,我们为Ciecle类指定了实例变量。
接下来的几行代码看起来像C语言中的函数原型。
- (void) setFillColor: (ShapeColor) fillColor;//声明常见的是以短线 - 和位于括号()中的返回值类型开头; 相当于C语言中的 void setFillColor(ShapeColor fillColor);
- (void) setBounds: (ShapeRect) bounds;
- (void) draw;
在Objective-C中,它们称为方法声明(method declaration)。方法声明列出了每个方法的名称、方法返回值的类型和某些参数。
上面的三个函数原型中,有两个有参数,一个没有。两个有参数的后面有“:”,另外一个没有“:”。可以遵循这样的一个规则,如果法方使用参数,则需要冒号,否则不需要冒号。
最后一行代码告诉编译器,我们已经完成了Circle类的声明。
@end
二、@implementation部分
通常接口被称为API(applincation programming interface的三个字母的首字母缩写)。而对象真正使对象能够运行的代码位于@implementation部分中。
@implementation Circle
- (void)setFillColor:(ShapeColor)c
{
fillColor = c;
}
- (void)setBounds :(ShapeRect) b
{
bounds = b;
}
第一行@implementation Circle中的是一个编译器指令,表明你将为某一个类提供代码。类名出现在@implementation 之后。该行的结尾没有分号,因为在Objective-C编译器指令后不必使用分号。
在@interface部分的
- (void) setFillColor: (ShapeColor) fillColor;
和@implementation部分的
- (void)setFillColor:(ShapeColor)c
变量不一样前者是fillColor后者是c,且后面的一个结尾没有分号。
那么为什么要给变量重新命名呢:
a.我们已经通过类定义了一个名为fillColor的实例变量,因为它在作用范围内可以在该方法中引用该变量,所以如果使用相同的名称定义另一个变量,编译器将会阻止我们访问实例变量。
b.在@interface部分的方法声明中使用名称fillColor,是为了告诉读者参数的真正作用。在实现中,我们必须区分参数名称和实例变量的名称,最简单的方法就是将参数重新命名。可以避免a中的问题。
第二个方法setBounds和上面的setFillColor类似。