在将一个对象分配给另一个对象时,实际发生了啥,保留对象还是整个副本?
Posted
技术标签:
【中文标题】在将一个对象分配给另一个对象时,实际发生了啥,保留对象还是整个副本?【英文标题】:while assigning one object to another what happens really, retain or whole copy of object?在将一个对象分配给另一个对象时,实际发生了什么,保留对象还是整个副本? 【发布时间】:2011-03-18 14:36:17 【问题描述】:classA
classB objB=[[classB alloc]init];
objB.hasAnotherRef=self;
classB
classA hasAnotherRef;
从上面看,将 classA 本身分配给 classB ivar hasAnotherRef 时发生了什么?
我的问题是
classA 有 classB ,然后 classB 再次有 classA by objB.hasAnotherRef=self; 这一行。
那么classA和classB的对象的大小是多少。
我很困惑。
哪个是最大的?
【问题讨论】:
【参考方案1】:这里的关键是Objective-C 对象总是指针。如果不是因为这个事实,两个结构的大小将是无限的(由于循环引用)。在适当的 Objective-C 中,这些类看起来像这样:
@class classA;
@class classB;
@interface classA
classB * objB;
@end
@interface classB
classA * objA;
@end
在这种情况下,两个类的大小都是一个指针的大小。
【讨论】:
实际上,一个指针的大小加上任何超类的大小,再加上struct objc_object
的大小,这是每个类的“基础”。最后给每个对象一个指针参数,称为isa
,它是一个指向对象Class
的指针。
@Jim Dovey:好点。我特别省略了超类以避免开销,但我应该提到 isa
指针。【参考方案2】:
使用这种伪代码没有帮助。使用可以编译的真实代码。
设置实例变量不会以任何方式改变对象的大小。 classA 的所有实例都存储一个对象的地址。 B 类的所有实例都存储一个对象的地址。
不管那个对象是什么,它可以是一个包含 100 万个字符串的数组,它不会影响你的 classA 或 classB 实例的大小。
【讨论】:
【参考方案3】:我不太清楚你的问题,但我认为你问的是对象是否在赋值时按值复制。如果这就是您所得到的,那么您的问题的答案是当对象被分配给另一个对象时,它的大小不会增长。而是设置了一个指向该对象的指针。
【讨论】:
发帖者的头脑中可能还有一些混淆,因为问题中的点语法能够隐式调用Objective-C 2.0中的setter,理论上它可以做任何事情,但实际上通常会保留?以上是关于在将一个对象分配给另一个对象时,实际发生了啥,保留对象还是整个副本?的主要内容,如果未能解决你的问题,请参考以下文章
在关于转换对象的地址空间的 c 样式类型转换过程中实际发生了啥?
如何在 STL 中使用指向向量的指针,就像我们在将数组地址传递给另一个函数时将指针分配给数组一样?
为啥在Javascript中将一个对象分配给另一个变量也会改变初始对象[重复]