对于编译器来讲,super仅仅是一个简单的标志来告诉编译器从什么地方开始搜索方法并执行;它只是用来作为一个消息的接收器。但是self实际上是一个变量,可以有多种用途,甚至可以给它赋值。

self被越来越多的使用在类方法的定义中。类方法通常和类的实例联系在一起,而不是对象。举例来说,在许多类方法中,会为一个实例分配内存并进行初始化,并同时赋值给一个变量。然后也许会试图通过向新创建的实例发送一个消息并且调用实例自己。但是往往这样子是一个错误的做法。self和super都指向接受消息并执行某个方法的对象。在实例方法里,self代表这个实例自己,但是在类的方法定义中,self则代表一个对象。下面的例子是需要避免的。

+ (Rectangle *)rectangleOfColor:(NSColor *) color
{
  self = [[Rectangle alloc] init]; // 很差的代码
  [self setColor:color];
  return [self autorelease];
}

为了避免混乱,在类方法里,我们推荐使用一个新的变量代替self来指向一个实例,见下面的代码:

+ (id)rectangleOfColor:(NSColor *)color
{
  id newInstance = [[Rectangle alloc] init]; // 较好的代码
     [newInstance setColor:color];
  return [newInstance autorelease];
}

实际上,相比较在类方法里发送alloc的消息给一个类,更好的做法是发送alloc消息给self。这样的好处是如果这个类是一个子类,并且rectangleOfColor:消息是由子类接收到的,那么返回的实例则为当前子类的实例(举例来说,NSArray的array方法就被NSMutableArray方法继承了,所以当我们创建一个NSMutableArray的实例时,返回的将是NSMutableArray类型实例,而不会是NSArray。)见以下示例:

+ (id)rectangleOfColor:(NSColor *)color
{
  id newInstance = [[self alloc] init]; // 推荐的代码
  [newInstance setColor:color];
  return [newInstance autorelease];
}

以上翻译自'The Objective-C Programming Language' of Apple Inc.

posted on 2011-03-16 17:36  iEarth  阅读(266)  评论(0编辑  收藏  举报