“类方法”和“静态方法”之间有什么区别?

时间:2011-11-11 03:05:03

标签: objective-c terminology static-methods class-method

我使用过几种不同的语言,例如Java,C#和Objective-C。

在大多数语言中,不需要对象实例的方法称为静态方法。然而,当谈到Objective-C时,有些人在你称之为静态方法时会变得防守,他们希望你把它们称为类方法。

为什么他们称为类方法而不是静态方法?静态方法和类方法有什么区别?

4 个答案:

答案 0 :(得分:71)

  

所以我的问题是为什么他们称之为类方法而不是a   静态方法?静态方法和a之间有什么区别?   类方法?

来自维基百科:静态方法既不需要该类的实例也不能隐式访问此类实例的数据(或此类,自我,Me等)。

这准确描述了Objective-C的类方法不是

Objective-C类方法非常需要一个实例作为方法调用的目标。也就是说,它需要一个描述被调用的类对象的元类实例。

与静态方法不同,Objective-C的类方法可以被继承(与前面提到的self结合使用,正是为什么许多类可以共享一个简单的+alloc实现的原因。 NSObject不需要自己的自定义实现)并且调用类方法会通过与任何其他方法调用站点完全相同的基于objc_msgSend*的调度机制。

Objective-C的类方法可以在类层次结构中重写,并且可以调整它们。在通常提供静态方法而不是类方法的语言中,这些都不受支持。

底线是静态方法和类方法非常不同。虽然这种差异对于日常编码目的而言大部分都是透明的,但仍然有一些情况可以了解类方法的工作方式,可以为您节省大量不必要的代码。

例如,您无法使用静态方法执行此操作:

@interface AbstractClass:NSObject
+ factory;
@end

@implementation AbstractClass
+ factory
{
    return [[[self alloc] init] autorelease];
}
@end

@interface Concrete1:AbstractClass
@end
@implementation Concrete1
@end
@interface Concrete2:AbstractClass
@end
@implementation Concrete2
@end

void foo() {
    Concrete1 *c = [Concrete1 factory];
    Concrete2 *d = [Concrete2 factory];
    ... etc ...
}    

答案 1 :(得分:4)

虽然类方法和静态方法在大多数情况下实际上是相同的,但它们是不同的。使用静态方法,该类充当命名空间限定符。使用类方法,类本身就是一个对象,因此类方法对类对象的实例方法与实例完全相同;因此,您可以执行以下操作

@interface TestClass : NSObject
+ (void)classOrInstanceMethod;
- (void)classOrInstanceMethod;
@end
...
NSArray * arr = [NSArray arrayWithObjects:
                        [[[TestClass alloc] init] autorelease],
                        [TestClass class],
                        nil];
for( id obj in arr )
    [obj classOrInstanceMethod];

调用classOrInstanceMethod的哪个版本取决于obj是类对象还是实例。如果您熟悉工厂类模式,则此模式是Objective-C语言的一部分。

答案 2 :(得分:4)

因为它是动态绑定的,而不是静态的。

因为它实际上是一个类对象的实例方法。

Objective-C类方法实际上是对象的类对象的实例方法。

用文字描述很难。在这里看到很好的插图。

http://www.sealiesoftware.com/blog/archive/2009/04/14/objc_explain_Classes_and_metaclasses.html

答案 3 :(得分:1)

这纯粹是历史上的差异,主要源于Objective-C是与C ++同时开发的事实,而且在C ++或更高版本的语言如Java和C#之前有很大影响。 Objective-C本质上是Smalltalk对象模型到C的一个端口,因此它的语法和术语不一定像C ++那样使用“C-like”。然而,Objective-C并没有因为没有使用“静态方法”这个词而逆势而上,因为这种趋势在1983年并没有得到很好的证实。