在将一个对象分配给另一个对象时,实际发生了啥,保留对象还是整个副本?

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中将一个对象分配给另一个变量也会改变初始对象[重复]

将类对象实例作为参数从 main() 传递给另一个类对象实例

将一个指针分配给另一个时的段错误