为什么在调用自己的类方法时需要使用[self class]?

Dun*_*gLe 3 objective-c self class-method

我在这里阅读了一个主题 http://www.mikeash.com/pyblog/friday-qa-2010-05-14-what-every-apple-programmer-should-know.html.迈克说"在调用你自己的类方法时总是使用[self class]".但我不明白为什么.你能给我举个例子吗 ?

Liy*_*ang 7

让我们说你有类foo,它有以下方法:

+(NSString*) bar{ return @"bar"; }

-(NSString*) barMethod{ return [[self class] bar]; }
Run Code Online (Sandbox Code Playgroud)

现在让我们说你有一个foo2继承自的类foo.如果你覆盖

+(NSString*) bar { return @"bar2" }
Run Code Online (Sandbox Code Playgroud)

正如您可能想要的那样,该方法barMethod将返回bar2.


bbu*_*bum 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
Run Code Online (Sandbox Code Playgroud)

那么这不会+classyThing从Abstract的实现中调用Concrete的doSomethingClassy:

[[[Concrete alloc] init] doSomethingClassy];
Run Code Online (Sandbox Code Playgroud)

如果你修改而doSomethingClassy[[self class] classyThing];预期它会工作.

(请注意,这是Liye Zhang的回答的一个具体例子 - 随意标记他的正确,因为他是第一个,只是没有具体的例子)