什么是使用点[自我类]

时间:2011-04-14 17:43:12

标签: objective-c xcode class self

此代码是否正确

@implementation Vehicle
+(id) vehicleWithColor:(NSColor*)color {
    id newInstance = [[[self class] alloc] init]; // PERFECT, the class is // dynamically identified
    [newInstance setColor:color];
    return [newInstance autorelease];
}
@end

为什么要使用[self class]

我认为自己已经指向静态方法的类(带+的那些)

2 个答案:

答案 0 :(得分:19)

支持子类化。如果你对类名进行了硬编码,就像在[[Vehicle alloc] init]中一样,那么Vehicle的子类必须覆盖+ vehicleWithColor:才能使它做正确的事情。使用[self class],您可以创建一个子类HarleyDavidson,[HarleyDavidson vehicleWithColor:[NSColor blackColor]]将自动执行正确的操作,创建一个HarleyDavidson实例而不是Vehicle实例。

修改:)

请参阅下面关于类方法中self[self class]的Joe的评论 - 在类方法中,它没有什么区别。但 是一种可以的情况。类可以响应根类中定义的实例方法 - -class本身就是这样一种方法,定义为NSObject协议中的实例方法。因此,如果通过添加实例方法来扩展诸如(例如)NSObject之类的根类,则该方法应该始终使用[self class],如果它需要引用它自己的Class对象。

答案 1 :(得分:18)

你是对的:[self class]在类方法中是不必要的(它通常在Objective-C而不是“静态”方法中称为),因为self已经是一个类,{ {1}}返回自己。

但它更有趣。在Objective-C中,类对象在技术上是元类的实例。所以类方法中的[self class]应该返回元类而不是类本身。但是出于实际目的,Objective-C隐藏了元类,因此它专门处理了这个案例。

关于这个主题的一些好读物: