“类方法”和“静态方法”有什么区别?
我已经使用了几种不同的语言,如Java,C#和Objective-C。
在大多数语言中,不需要对象实例的方法称为静态方法。 然而,当谈到Objective-C时,有些人把它们称为静态方法时会有防御性,他们希望你称之为类方法。
为什么他们调用类方法而不是静态方法? 静态方法和类方法有什么区别?
所以我的问题是为什么他们调用类方法而不是静态方法? 静态方法和类方法有什么区别?
静态方法既不需要类的实例,也不能隐式地访问这样一个实例的数据(或者这个,我,Me等等)。
这正好描述了Objective-C的类方法不是什么 。
一个Objective-C类的方法非常需要一个作为方法调用目标的实例。 也就是说,它需要描述被调用的类对象的元类实例。
与静态方法不同,Objective-C的类方法可以被inheritance(这与前面提到的self
相结合,正是为什么许多类可以共享NSObject
上+alloc
的单个简单实现,而不需要自己的自定义实现)一个类方法和其他任何方法调用站点一样,通过完全相同的基于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 ... }
尽pipe类方法和静态方法在大多数情况下是相同的,但它们是不同的。 使用静态方法,该类充当名称空间限定符。 有了类方法,类本身就是一个对象,所以类方法就是把类对象完全一样的东西方法实例化到一个实例中; 因此,您可以执行以下操作
@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语言的一部分。
因为它是dynamic绑定的,而不是静态的。
因为它实际上是一个类对象的实例方法。
Objective-C类方法实际上是一个对象的类对象的实例方法。
用文字描述很难。 在这里看到漂亮的插图
http://www.sealiesoftware.com/blog/archive/2009/04/14/objc_explain_Classes_and_metaclasses.html
这纯粹是一种历史的差异,主要源于Objective-C与C ++同时开发的事实,在C ++或更高版本的Java和C#等语言之前有很大的影响。 Objective-C本质上是Smalltalk对C模型的一个端口,所以它的语法和术语不一定像C ++所使用的那样“C”。 然而Objective-C并没有使用“静态方法”这个术语,因为这种趋势在1983年还没有完全确定。