我是Objective-C的新手,想知道是否有人可以提供任何信息来为我澄清这一点。我对其他语言中的对象实例化的理解(可能是错误的)是对象将获得它自己的实例变量副本以及实例方法,但我注意到我所有的文献都是到目前为止,关于Objective-C的描述似乎表明该对象只获取实例变量的副本,即使在调用实例方法时,程序控制也会恢复到类本身内部定义的原始方法。例如,Apple开发者网站的这个页面显示的程序流程图表明了这一点:
同样在Kochan"编程在Objective-C",第6版,pg。 41,参考一个示例分数类和对象,作者声明:
"第一条消息将setNumerator:消息发送到myFraction ...然后将控件发送到您为Fraction类定义的setNumerator:方法... Objective-C ...知道它& #39;这个类要使用的方法,因为它知道myFraction是Fraction类的一个对象"
on pg。 42,他继续说道:
"当你分配一个新对象时......在内存中保留了足够的空间来存储对象的数据,其中包括用于实例变量的空间,还有一些...... "
所有这些似乎都向我表明,只有任何方法的副本,类中定义的原始方法,并且在调用实例方法时,Objective-C只是将控制传递给该原始副本并暂时"连线"到被调用对象的实例变量。我知道我可能没有使用正确的术语,但这是正确的吗?这似乎是合乎逻辑的,因为创建相同方法的多个副本会浪费内存,但这使我重新思考我对对象实例化的全部理解。任何投入将不胜感激!谢谢。
答案 0 :(得分:1)
你的推理是正确的。实例方法由类的所有实例共享。原因是,正如您所怀疑的那样,以另一种方式这样做会大量浪费内存。
你所说的临时接线是每个方法都有一个额外的隐藏参数传递给它:指向调用对象的指针。由于这使得方法可以访问调用对象,因此它可以轻松访问所有必需的实例变量,一切都很好。请注意,任何static
变量也只存在于单个实例中,如果您不知道这一点,则可能会发生意外情况。但是,常规局部变量不会被共享,并且会在每次调用方法时重新创建。
Apple关于此主题的documention非常好,所以请查看更多信息。
答案 1 :(得分:1)
只需将方法视为一组指令即可。没有理由为每个对象提供相同方法的副本。我想你也可能会误解其他语言。方法与类相关联,而不是与单个对象相关联。
答案 2 :(得分:1)
是的,你的想法或多或少是正确的(虽然它比这更简单:在大多数此类语言的幕后方法不需要“连接”到任何东西,它们只需要为{{1}采取额外的参数并在引用实例变量之前插入struct lookups。
令您感到困惑的是,并非所有语言都以这种方式工作,在其实现中以及语义。面向对象语言(非常粗略地)分为两个阵营:基于类,如Objective-C;和Javascript一样,基于原型。在第二语言阵营中,方法或过程本身就是一个对象,并且通常也可以直接分配给对象的实例变量 - 没有类来从中查找方法,仅对象和其他对象,都具有相同的一等状态(这是过于简单化,良好的语言仍然允许共享和效率)。