为什么在有完美的父类方法时需要这些类方法?

问题描述:

为什么类方法,如为什么在有完美的父类方法时需要这些类方法?

+ (NSMutableArray *)array; 

当有完美的罚款父类的方法,如

+ arrayWithObjects:(id)firstObj, ...; 

它可以设置为

[array arrayWithObjects:nil] 

,并具有相同的效果所需。

他们实际上是不是等同的东西?

它们是简便的方法,可以更快速地获得自动释放对象,而不必为了得到相同的结果而写更多的东西。

顺便说一句,NSArray没有一个名为arrayWithObjects的实例方法,它们只是类方法。

+0

不是“+”表示arraryWithObjects是类方法吗?我不认为我理解为什么我暗示它是一个实例方法 – Devoted 2010-06-17 14:25:49

+0

@Devoted,'[array arrayWithObjects]'试图调用一个不存在的实例方法。 – 2010-06-17 14:26:41

+1

您无法在Obj-C中的实例上调用类方法。正确的调用看起来像'[NSArray arrayWithObjects:nil];' – kubi 2010-06-17 14:27:36

雅各布的答案是正确的(所以接受那个),但我会补充说Cocoa框架有一个叫做类集群的引人注目的东西。这个想法是,虽然你可能会打电话给[NSArray array],但你得到的对象实际上是NSArray的一个私有子类,它针对你的具体情况进行了优化。这些便利的方法可以给NSArray类提供一个“提示”,指出要使用哪个类。

例如,如果您致电[NSArray array],您会得到一个空的不可变阵列。那么,一个空的不可变数组有多少个不同的值?只有一个。所以在幕后,Cocoa可以返回相同的空NSArray给每个[NSArray array]的调用,这样它只需要分配其中的一个。这是一个可以节省一些内存的漂亮优化。

现在,这实际上是一个你不需要关心的实现细节,但是要考虑的是你应该使用最接近你想要的结果的构造函数,特别是对于像数组,集合,和字典,因为苹果公司实施了一系列优化,使您的应用程序更好地工作。