2013-07-27 82 views
0

在有效的Objective-C 2.0有以下剪斷代碼:沒有在實例變量保留

@interface EOCClass : NSObject { 
    id _object; 
} 
@end 

@implementation EOCClass 
- (void)setup{ 
    _object = [EOCOtherClass new]; 
} 
@end 

筆者接着說:

「的_object實例變量不會自動保留其值在手動引用計數下,但在ARC下。「

我在XCode中測試了上面的代碼片段,並且實例變量確實保留了值(即一切看起來都很好)。

作者用上面的語句表達了什麼?

回答

5

他意味着:

的_object實例變量不會自動保持其手動參考計數值之下但在ARC一樣。

那樣簡單。如果這個工程MRC下,它爲一個原因:

[SomeClass new] 

相當於

[[SomeClass alloc] init] 

所以_object將有一個的引用計數不管。

+0

我同意你的回答,但它沒有說明爲什麼作者會說,_object不會自動保留其在MRC下的值,因爲[SomeClass new]會使對象的保留計數爲1,因此將保留在MRC下。 – user2599140

+0

@ user2599140不,它不會被保留。它將被分配一個引用計數。 MRC不使用強指針,ARC使用強指針,並且在ARC下,它將被自動保留**,另外**被分配(因爲ivars默認強壯)。 – 2013-07-28 11:09:51

+0

@ user2599140希望H2CO3能幫你解釋一點。我同意這本書中的措辭很尷尬,使它有點混亂。我一定會爲未來解決這個問題。如果您願意,請隨時在我們的電子郵件鏈上繼續聊天。絕對是一個好主意,以確保你瞭解這個東西! – mattjgalloway

3

本書作者混淆了兩個不同的東西。首先,表達式:

[EOCOtherClass new] 

返回對調用方擁有所有權的對象(可能是許多所有者之一)的引用。在MRC的某個時間點,主叫方必須安排放棄該所有權(releaseautorelease)。調用者可以通過傳遞所有權直接或間接完成此操作。在ARC下,所有權自動管理。

其次,聲明:

id _object; 

聲明持有id類型的引用的變量。在MRC中,只有它是這樣做的,變量不是擁有任何它們包含的引用引用 - 它們只是一個存儲引用的地方,所有權管理是分開的。

但是在ARC變量可以擁有它們引用的東西,實例變量的默認所有權模式是strong - 這意味着變量保持了它引用的所有權。當一個新的引用被存儲到一個變量中時,所有權將被放棄在先前引用的對象上,並且在新引用的對象上聲明所有權。所有這些都是自動的,並由ARC處理。

在MRC和ARC下,顯示的代碼片段分配並擁有EOCOtherClass的實例。在MRC下,所有權必須在某個時候手動放棄。在ARC下,所有權將在適當的時候自動放棄。

+0

因此,在MRC下運行時沒有對象所有權的概念?這是有道理的,因爲retain實例方法僅返回self。保留/釋放似乎只是增加/減少保留數量,而不關心對象所有權。 這就是爲什麼作者說_object不保留其價值?他是否暗示在MRC下,物體不擁有物體? – user2599140

+0

不完全。 MRC和ARC都研究對象所有權的概念;並且在MRC *變量*(var)下沒有擁有對象的概念。 *對象*擁有,您通過*引用*(ref)引用對象,並將引用存儲在*變量*中。通過MRC,程序員管理所有權;在var中存儲ref不會影響所有權。使用ARC所有權是自動管理的,並由參考文獻完成。如果一個ref被存儲在var聲明的var中(通常隱式地)來保存'strong' refs,那麼這個操作確定所有權是必需的 - 所以有效的變量將成爲所有者。 – CRD