2010-08-12 149 views
1

我有一個視圖控制器。視圖控制器有一個名爲streamController的保留對象,它是一個NSObject子類,用於處理與我的服務器的所有數據I/O。一切都很好,除了我試圖找出爲什麼一些東西在所說的streamController上泄漏。我在那裏放了一個NSLog,我從來沒有看到它發射。我完全不明白爲什麼,因爲我在我的視圖控制器的dealloc方法中釋放了控制器。爲什麼我的類的dealloc沒有被調用?

從視圖控制器接口...

StreamController *streamController; 
@property (nonatomic, retain) StreamController *streamController; 

從視圖控制器實現...

@synthesize streamController; 

- (id)init { 
    [super init]; 
    self.streamController = [[StreamController alloc] init]; 
} 

- (void)dealloc { 
    NSLog(@"dealloc view controller"); 
    [streamController release]; 
    [super dealloc]; 
} 

從StreamController實現...

- (void)dealloc { 
    NSLog(@"dealloc stream controller"); 
    [super dealloc]; 
} 

這最後的dealloc永遠不會調用。爲什麼?

+0

哪裏是streamController設置? – jtbandes 2010-08-12 07:15:59

+0

剛剛更新以顯示 – 2010-08-12 07:17:18

+0

您使用它之後是否釋放* streamController? *沒關係,你更新你的代碼已經* – elslooo 2010-08-12 07:17:46

回答

3

我相信你只是泄漏內存, 如果你的財產有保留的屬性,那麼你應該看看下面的例子:

//A 
self.streamController = [[StreamController alloc] init]; 

//B 
StreamController * st = [[StreamController alloc] init]; 
self.streamController = st; 
[st release]; 

//C 
streamController = [[StreamController alloc] init]; 

如果選中保留數,你會看到,在一個接近你streamController對象將有2 retainCount,而B區也將只有1

原因:這樣做[[StreamController alloc] init];你的對象已經一012

在一之前通過它到您的財產。然後,由於您聲明它爲保留,因此它將被保留,因此它的retainCount變爲2.

在B中基本相同,但在您將它傳遞給您的屬性後纔會釋放該對象。因此,它以1的retainCount結束。(這是我們想要的)

在C中,您沒有使用該屬性,而是直接設置該值。因此它只會保留一次。在這種情況下這很好,因爲是初始化。

我會建議使用B或也許c。如果是肯定streamController是零(如您的對象的初始化)

希望這有助於

+0

哇。我不知道self.x = [[任何alloc] init]之間有區別。和x = [[任何alloc] init]; 這似乎很愚蠢。謝謝! – 2010-08-12 08:09:29

+0

Yep:'foo.x = whatever'實際編譯爲'[self setX:whatever]'(假設foo是一個Objective-C對象)。 – Wevah 2010-08-12 08:21:47

相關問題