我目前正在阅读关于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的一个实例调用日期方法吗?我不明白。
这本书不再解释我上面引用的内容,所以我确信这是一些愚蠢而且基本的我没有得到的。我希望这对其他人来说不是太具体或无益。如果被问到,我会删除提交的内容。谢谢。
答案 0 :(得分:2)
变量now
指向NSDate
的实例。方法date
未在NSDate
的实例上定义,而是在类本身上定义。因此,date
是类方法,而不是实例方法。与其他编程语言不同,Objective-C不会将类方法继承到其类实例。
反之亦然,实例方法无法在类上调用。这表示timeIntervalSince1970
无法在类NSDate
上调用,因为此方法是实例方法。这是由于实例通常管理实例状态的情况。实例方法确实对此实例状态进行操作,即读取和修改其实例变量。回到您的示例:实例方法timeIntervalSince1970
计算01/01/1970与具体的实例化日期之间的差异。因此,如果您能够在课程级别调用timeIntervalSince1970
,则无法计算日期的差异,因为班级NSDate
不会携带任何日期信息(实例状态) !)如日,月,年和时间。
总结:无法在类上调用实例方法。我所知道的任何编程语言都不支持这一点。然而,某些编程语言支持在实例上调用类方法,尽管通常不需要这样做,有时它甚至会降低代码的可读性。但是,Objective-C也不支持这些调用。