2011-03-18 26 views
1
classA{ 

    classB objB=[[classB alloc]init]; 

    objB.hasAnotherRef=self; 


} 


classB{ 

    classA hasAnotherRef; 


} 

从上面发生什么时,classA本身分配给classB ivar hasAnotherRef?同时将一个对象分配给另一个对象,确实发生了什么,保留或整个对象的副本?

我的问题是

CLASSA有CLASSB,然后再CLASSB有CLASSA通过 objB.hasAnotherRef =自我;这一行。

那么classA和classB的对象的大小是多少?

我很困惑。

哪个是规模最大的?

回答

2

这里的关键是Objective-C对象始终是指针。如果不是这个事实,两个结构的大小将是无限的(由于循环引用)。在适当的Objective-C,类会是这个样子:

@class classA; 
@class classB; 

@interface classA { 
    classB * objB; 
} 
@end 

@interface classB { 
    classA * objA; 
} 
@end 

在这种情况下,这两个类的大小是一个指针的大小。

+1

实际上,一个指针的大小加上任何超类的大小,加上每个类的“基础”结构objc_object的大小。这最后给每个对象一个更多的指针参数,称为'isa',它是一个指向对象'Class'的指针。 – 2011-03-18 16:08:31

+0

@Jim Dovey:好点。我特别省略了超类以避免开销,但我应该提到'isa'指针。 – 2011-03-18 16:28:41

1

使用这种伪代码没有帮助。使用将编译的真实代码。

设置实例变量不会以任何方式更改对象的大小。 classA的所有实例都存储一个对象的地址。 classB的所有实例都存储一个对象的地址。

这个对象是什么并不重要,它可以是一个100万个字符串的数组,它不会影响您的classA或classB实例的大小。

1

我不是很清楚你的问题,但我认为你问是否按对象的价值复制了对象。如果这就是你所得到的,那么对你的问题的回答是,当对象被分配给另一个对象时,对象不会增长。而是设置一个指向该对象的指针。

+0

由于在问题中的点语法可以隐式地在Objective-C 2.0中调用setter,这在理论上可以做任何事情,但在实践中通常会保留下来,这在海报的头脑中可能也存在一些混淆。 – Tommy 2011-03-18 15:24:43

相关问题