为什么在调用类方法之前通过+(Class)类发送类?

时间:2011-05-01 18:46:45

标签: objective-c

我一直在浏览Sketch,这是他们随Xcode发布的一个示例程序,我一直看到这样的事情(并非总是如此):

[[MyClass class] classMethod]

现在,由于MyClass不是该类的实例,我只会这样做:

[MyClass classMethod]

作为一项实验,通过覆盖+ (Class)class并返回另一个类,我能够在上述两个语句之间做出改变!如果您想要这样做,您需要使用以前的版本才能使用它,所以我可以看到可能是这个的用法,但是真的存在吗?

+class听起来像是一个非常糟糕的想法篡改,但如果有的话请赐教。谢谢!


要查看一些示例,请查看-copy:中找到的Sketch程序中SKTGraphicsView.m中的方法Developer/Examples/Sketch/

2 个答案:

答案 0 :(得分:5)

在你引用的情况下,我真的没有理由打电话给+class。但是,肯定会调用[[self class] doSomething]而不是[[MyClass class] doSomething]。在第一种情况下,如果对象已经被子类化,[self class]可以返回正确的结果。在第二种情况下,您将始终获得MyClass类对象,这意味着MySubClass无法有效地覆盖+doSomething类方法。

答案 1 :(得分:0)

在这种情况下使用+class是没有充分理由的。 +class只返回调用它的对象(类对象),与-self相同。在大多数情况下,人们使用[SomeClass class]来获取类的类对象,因为类的名称不是表达式,并且只能作为特殊情况用作消息调用语法中的接收者。因此,在所有其他上下文中,他们使用[SomeClass class]将类对象作为表达式(尽管[SomeClass self]也可以同样有效)。

在您展示的情况下,它是多余的,因为它是消息的接收者。我猜他们是出于习惯或无知而做的(他们认为你必须总是写[SomeClass class]来使用这个类。)