2013-06-24 72 views
3

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

+0

我不知道,如果你的问题源于对[类方法](http://developer.apple.com/library/ios/#documentation/general/conceptual/DevPedia-CocoaCore/ClassMethod.html)是什么的缺乏清晰度,即那些实现它们的方法以'+'开始,用于类,而不是用于该类的对象的特定实例,而不是用于更频繁地看到的实例方法(实现以'-'开头的那些方法),或者是否有问题关于使用'[self class]'构造的使用。 – Rob

+0

我的意思是为什么使用'[[self class] method]'而不是'[className method]' – DungLe

+3

啊。如果你的对象已被子类化,并且你可能想要使用方法的子类再现,那么这很有用,所以你可以享受子类的完整行为,即使用子类中'method'的版本。 – Rob

回答

7

比方说,你有一流的foo,它有以下几种方法:

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

-(NSString*) barMethod{ return [[self class] bar]; } 

现在让我们说你有一个类foo2foo继承。如果重写

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

方法barMethod将返回bar2,因为你可能打算为它。

+0

'[foo barMethod]'和'[foo2 barMethod]'也可以吗?哪个问题 ? – DungLe

+0

@DungLe我的答案只是一个具体的例子,这个答案与一些更多的细节。这个答案非常正确,只是有点简单。里耶比我更值得神奇的互联网业力点,但一个评论太短,没有实现具体的代码。 – bbum

+0

一个真实世界的例子是'UIView'的'layerClass'方法。 –

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 

那么这会不会致电混凝土的+classyThing从抽象的实施doSomethingClassy

[[[Concrete alloc] init] doSomethingClassy]; 

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

(注意,这是立业张的回答一个具体的例子 - 随意纪念他正确的,因为他是第一次,只是没有用很为例混凝土)

+0

结果似乎是相同的(从我刚刚运行的一些测试),无论你是做[[self class] someClassMethod]还是'[self someClassMethod]'。所以我没有看到使用'[self class]'而不是'self'来调用类方法。 – rmaddy

+0

@rmaddy在类方法中,由于'+ [NSObject class]'被定义为'return self',所以不论你说'self'还是'[self class]'都没关系。在一个实例方法中,你必须说'[self class]'。 –

+1

@robmayoff谢谢。我明白了。但是仍然不清楚为什么要在类方法中选择'[self class] someClassMethod]''over'[some someClassMethod]'。如果您更改将方法调用为实例方法的类方法,唯一的原因是什么? – rmaddy

相关问题