代码:
@implementation Circle -(void) setFillColor: (ShapeColor) c { fillColor=c; } -(void) setBounds: (ShapeRect) b { bounds=b; } -(void) draw { NSLog(@"draw a cifrcle at(%d %d %d %d) in %@",bounds.x,bounds.y,bounds.width,bounds.heihgt,colorName(fillColor)); } @end
@implemention
是一个编译器制定,表明你将为某个类提供代码。类名出现在@implemention之后,该行的结尾处没有分号。
接下来是各个方法的定义。它们不必按照在@interface指令中的顺序出现,你甚至可以在@implementation中定义那些在@interface中无相应生命的方法。可以把他们看成是私有方法,仅在类的视线中使用
你也许认为,既然单独在@implementation指令中定义方法,就不能从该实现之外访问该方法。但事实并非如此,Objective-C中不存在真正的私有方法,也无法把某个方法标识为私有方法,从而禁止其他代码调用它。这是Objective-C动态本质的副作用
setFillColor: 定义的第一行看上去与@interface部分的声明非常类似。二者的主要差别是结尾处没有分号。我们把参数重新命名为简单的c字符了,@interface和@implementation间的参数名不同是正确的。在这里如果我们继续使用参数名fillColor,就会隐藏fillColor实例变量,并且编译器会生成警告信息。
说明:为何一定要重新命名fillColor呢?我们已经通过类定义了一个名为fillColor的实例变量,可以在该方法中引用该变量——它在作用于范围中。因此,如果使用相同的名称定义一个变量,编译器会阻止我们访问该实例变量,使用相同的变量名会隐藏处事变量,可以为参数使用新的名称来避免该问题。
@interface部分的方法生命中使用了名称fillColor,是为了确切告诉读者参数的用处,在实现中,我们必须区分参数名称和实例变量名称,最简单的方式就是讲参数重新命名。
setFillColor方法只有一行代码:fillColor=c;如果你特别好奇,可能会对实例变量的存储位置感兴趣,在Objective-C中调用方法时,一个名为self的秘密隐藏参数将被传递给接收对象,而这个参数引用的就是该接收对象。例如,在代码[circl setFillColor:kRedColor]中,方法将circle作为其瑟利夫参数进行传递。因为self的传递过程是秘密的和自动的,因此你不必自己来实现。方法中引用实例变量的代码如下所示:self->fillColor=c;顺便提一下,传递隐藏的参数是另一种间接操作的示例。因为Objective-C运行时(runtime)可以将不同的对象当成隐藏的self参数传递,所以那些对象的实例变量发生更改时,运行时也可进行相应的更改。
说明:用户运行应用程序是,Objective-C运行时是支持这些应用程序的代码块。运行时执行非常重要的任务,如想对象发送消息和传递参数。