此代码是否正确
@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]
我认为自己已经指向静态方法的类(带+的那些)
答案 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隐藏了元类,因此它专门处理了这个案例。
关于这个主题的一些好读物: