了解ObjC坏消息示例?

时间:2014-09-22 04:42:36

标签: objective-c class instance method-call

我目前正在阅读关于Objective C编程的 The Big Nerd Ranch Guide ,我无法理解第13章,对象中提供错误示例的部分消息:

NSDate *now = [NSDate date];
double seconds = [now timeIntervalSince1970];

这首先是在Objc中使用消息的正确示例。第一行使用变量now和NSDate类型声明创建指向NSDate对象的指针。它现在是NSDate的一个实例。向我解释说,如果要打印now,它将显示NSDate日期方法的输出。这就是我开始变得有些奇怪的地方。看起来奇怪的是你有一个变量指向一个实例,如果打印了一个函数输出。但那没关系。继续。

第二行创建一个名为seconds的变量,其类型为“double”,并且将获得NSDate实例now的timeIntervalSince1970方法输出的值。

以下是作者介绍错误消息的示例:

double testSeconds = [NSDate timeIntervalSince1970];
NSDate *testNow = [now date];

他解释错误如下:

第一行

  

“错误已清除,此消息中的接收方是NSDate   class,所以选择器应该是NSDate类方法的名称。   这个选择器不是。“

确定。这是有道理的。一种无效的方法。下一个。 。

第二行:

  

“这个错误不太清楚:它告诉你NSDate没有   名称与日期选择器匹配的实例方法。“

等等,什么? now不是指向NSDate实例的指针吗?你不应该能够从NSDate的一个实例调用日期方法吗?我不明白。

这本书不再解释我上面引用的内容,所以我确信这是一些愚蠢而且基本的我没有得到的。我希望这对其他人来说不是太具体或无益。如果被问到,我会删除提交的内容。谢谢。

1 个答案:

答案 0 :(得分:2)

变量now指向NSDate实例。方法date未在NSDate的实例上定义,而是在类本身上定义。因此,date类方法,而不是实例方法。与其他编程语言不同,Objective-C不会将类方法继承到其类实例。

反之亦然,实例方法无法在类上调用。这表示timeIntervalSince1970无法在类NSDate上调用,因为此方法是实例方法。这是由于实例通常管理实例状态的情况。实例方法确实对此实例状态进行操作,即读取和修改其实例变量。回到您的示例:实例方法timeIntervalSince1970计算01/01/1970与具体的实例化日期之间的差异。因此,如果您能够在课程级别调用timeIntervalSince1970,则无法计算日期的差异,因为班级NSDate不会携带任何日期信息(实例状态) !)如日,月,年和时间。

总结:无法在类上调用实例方法。我所知道的任何编程语言都不支持这一点。然而,某些编程语言支持在实例上调用类方法,尽管通常不需要这样做,有时它甚至会降低代码的可读性。但是,Objective-C也不支持这些调用。