我在这里读了一个主题 http://www.mikeash.com/pyblog/friday-qa-2010-05-14-what-every-apple-programmer-should-know.html。迈克说“在调用你自己的类方法时总是使用[self class]”。但我不明白为什么。你能举个例子吗?
答案 0 :(得分:7)
假设您有班级foo
,其中包含以下方法:
+(NSString*) bar{ return @"bar"; }
-(NSString*) barMethod{ return [[self class] bar]; }
现在假设您有一个继承自foo2
的班级foo
。如果您覆盖
+(NSString*) bar { return @"bar2" }
方法barMethod
将返回bar2
,正如您可能想要的那样。
答案 1 :(得分:6)
与其他OO语言不同,Objective-C中的类方法都是继承的,可以被覆盖。
因此,如果你有:
@immplementation Abstract // : NSObject
- (void) doSomethingClassy
{
[Abstract classyThing];
}
+ (void) classyThing
{
... some classy code ...;
}
@end
@interface Concrete : Abstract
@end
@implementation Concrete
+ (void) classyThing
{
... some classy code ...;
[super classThing];
}
@end
然后,这不会从Abstract的+classyThing
实现中调用Concrete的doSomethingClassy
:
[[[Concrete alloc] init] doSomethingClassy];
如果您修改doSomethingClassy
来执行[[self class] classyThing];
,那么它将按预期工作。
(请注意,这是Liye Zhang的回答的一个具体例子 - 随意标记他的正确,因为他是第一个,只是没有具体的例子)