2011-03-18 38 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

相關問題