如何解决使用[self class]的重点是什么
| 此代码正确吗?@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已经指向静态方法的类(带有+的类)
解决方法
您说对了:在类方法中(在Objective-C中,它通常被称为而不是“ static \”方法,而在方法中更通常称为“ 1”)是不必要的,因为“ 2”已经是一个类,而“ 1”会返回自身。
但这变得更加有趣。在Objective-C中,类对象从技术上讲是元类的实例。因此,类方法中的“ 1”应返回元类而不是类本身。但是出于实际目的,Objective-C隐藏了元类,因此它专门处理这种情况。
关于此主题的一些不错的阅读:
http://www.sealiesoftware.com/blog/archive/2009/04/14/objc_explain_Classes_and_metaclasses.html
继承图:http://www.sealiesoftware.com/blog/class%20diagram.pdf
http://cocoawithlove.com/2010/01/what-is-meta-class-in-objective-c.html
,它支持子类化。如果您对类名进行了硬编码(如
[[Vehicle alloc] init]
中所示),那么Vehicle的子类将必须重写+ vehicleWithColor:使其正确执行操作。使用[self class]
,您可以创建子类HarleyDavidson,而[HarleyDavidson vehicleWithColor:[NSColor blackColor]]
将自动执行正确的操作,从而创建HarleyDavidson实例而不是Vehicle实例。
(编辑:)
有关类方法中的self
与[self class]
的信息,请参见下面的Joe \的注释-在类方法中,这没有什么区别。但是有可能的情况。类可以响应在根类中定义的实例方法-ѭ10本身就是这样的方法,在NSObject协议中定义为实例方法。因此,如果通过添加实例方法来扩展根类(例如,NSObject),则该方法在需要引用其自己的Class对象时应始终使用ѭ1。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。