2010-08-12 174 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