2010-12-23 131 views
1

我想了解一下分配具有保留屬性的對象,這樣的事情:目標C:保留VS頁頭 - 再訪

self.viewController = [[RootViewController alloc] init]; 

RootViewController *viewController; 

@property (nonatomic, retain) RootViewController *viewController; 


@implementation ... 

viewController = [[RootViewController alloc] init]; 

,因爲它做類似的東西是不正確的

因爲這樣會將對象保留計數提高2,並且您將不得不釋放對象兩次,其中一個處於dealloc方法中。

如果我分配我的對象,那麼使用assign屬性會更好嗎?或者什麼時候需要保留一個使用alloc方法分配的對象。

我對這個問題非常困惑,所以請你向我舉例說明這種情況是否有效。

非常感謝,我非常感謝。

問候,

回答

7

當你傳遞一個對象到別的地方去,你希望採取控制它,這是標準的做法,autorelease它:

self.viewController = [[[RootViewController alloc] init] autorelease]; 

或者你可以release設置變量它自己後:

RootViewController *controller=[[RootViewController alloc] init]; 
self.viewController = controller; 
[controller release]; 

你的第一個例子並不一定不好的做法,雖然有一定的程序員誰相信它。這取決於上下文。

在這種情況下使用assign可能是錯誤的。

+2

很好的答案。 `assign`完全錯誤。值得注意的是,如果稍後通過`self.viewController = someOther;`重設值,那麼*如果該屬性爲`assign`,則*不會是所有權轉移。 – bbum 2010-12-23 18:35:25

0

不,你應該做的是自動釋放你的RootViewController的,或直接在上面,在那裏你從一開始就對象的所有權的情況下,分配給伊娃。

+0

感謝您的回答,但我並沒有真正明白從一開始就取得對象的所有權? – mshaaban 2010-12-23 18:38:33

+0

然後您需要閱讀內存管理規則。 – jer 2010-12-23 21:59:10

1

指定是錯誤的。 'retain'屬性意味着你的對象擁有viewController的所有權。可以在初始化程序中像這樣分配它,但如果將viewController設置爲不同的對象,則'retain'屬性決定了在創建對象後會發生什麼。

對於保留的屬性,生成的制定者會是這個樣子:

- (void)setViewController: (UIViewController*)value 
{ 
    if (viewController != value) { 
     [viewController release]; 
    } 
    viewController = [value retain]; 
} 
1

如果設置該屬性爲保留,然後使用自動釋放將是適當如下:

self.viewController = [[[RootViewController alloc] init] autorelease]; 

製作確定你使用「自我」。以確保您使用合成的setter,它將處理保留周圍的細節。