Objective c 理解ObjC错误消息示例?

Objective c 理解ObjC错误消息示例?,objective-c,class,instance,method-call,Objective C,Class,Instance,Method Call,我目前正在阅读关于Objective C编程的《Big Nerd Ranch指南》,我很难理解第13章“对象”中的一节,该节提供了一些错误的消息示例: NSDate *now = [NSDate date]; double seconds = [now timeIntervalSince1970]; 这首先是在Objc中使用消息的正确示例。第一行使用变量now和NSDate类型声明创建指向NSDate对象的指针。它现在是NSDate的一个实例。有人向我解释说,如果现在要打印,它将显示NSDat

我目前正在阅读关于Objective C编程的《Big Nerd Ranch指南》,我很难理解第13章“对象”中的一节,该节提供了一些错误的消息示例:

NSDate *now = [NSDate date];
double seconds = [now timeIntervalSince1970];
这首先是在Objc中使用消息的正确示例。第一行使用变量
now
和NSDate类型声明创建指向NSDate对象的指针。它现在是NSDate的一个实例。有人向我解释说,如果现在要打印
,它将显示NSDate方法的输出。这就是我开始觉得有点奇怪的地方。看起来奇怪的是,如果打印的话,会有一个变量同时指向一个实例和一个函数输出。但没关系。继续

第二行创建了一个名为
seconds
的变量,该变量的类型为“double”,它将获得一个值,NSDate实例
的TimeIntervalence1970方法现在输出该值

以下是作者介绍不良消息示例的地方:

double testSeconds = [NSDate timeIntervalSince1970];
NSDate *testNow = [now date];
他对错误的解释如下:

第一行

“错误很明显,此消息发送的收件人是NSDate 类,因此选择器应该是NSDate类方法的名称。 此选择器不可用。”

嗯。这是有道理的。无效的方法。接下来

第二行:

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

等等,什么?
现在不是指向NSDate实例的指针吗?难道不能从NSDate实例调用date方法吗?我不明白


这本书没有解释任何比我上面引用的更多的东西,所以我肯定这是一些愚蠢和基本的东西,我没有得到。我希望这不是太具体或者对其他人没有帮助。如果有人问我,我会删除提交的内容。多谢各位

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

反之亦然,不能对类调用实例方法。不能在类
NSDate
上调用上述
timeIntervalSince1970
,因为此方法是一个实例方法。这是由于实例通常管理实例状态的情况造成的。实例方法在这个实例状态下进行操作,即读取和修改它们的实例变量。回到您的示例:实例方法
timeIntervalSince1970
计算1970年1月1日和具体实例化日期之间的差异。因此,如果您能够在类级别调用
timeIntervalSince1970
,就没有机会计算日期差异,因为类
NSDate
不包含任何日期信息(实例状态!),例如日期、月份、年和时间


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

那么NSDate的实例不“继承”NSDate类方法吗?和实例方法仅适用于对象的实例?这似乎令人困惑。来自python,其中一个类实例继承了所有类方法。实例方法是闻所未闻的。我想我得把这一章再读一遍。谢谢忘记在原件上贴标签了reply@Owatch否,
NSDate
不会将其类方法继承到其实例。是的,实例方法仅对类的实例可用。请注意正确的措辞:类的实例=对象。关于您的问题,请参阅我的更新答案。@Owatch您确定Python没有实例方法吗?另外,Python(不幸的是)不是我到目前为止使用过的语言,我发现实例方法确实存在:好吧,当链接的示例讨论实例方法时,不是实例存在单独的方法,而是某些方法在实例不存在的情况下无法工作。在Python中使用“self”在实例中很有用,因为可以将局部变量分配给各个实例。如果对象的方法将变量名设置为self.NAME。它使self.NAME可以跨对象的所有方法访问。而不是局限于那种方法。似乎我对实例方法的想法不一样。实例方法仅在实例存在时有效。