我使用过几种不同的语言,例如Java,C#和Objective-C。
在大多数语言中,不需要对象实例的方法称为静态方法。然而,当谈到Objective-C时,有些人在你称之为静态方法时会变得防守,他们希望你把它们称为类方法。
为什么他们称为类方法而不是静态方法?静态方法和类方法有什么区别?
答案 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年并没有得到很好的证实。