为什么dealloc没有被我的班级调用?

时间:2010-08-12 07:14:21

标签: iphone objective-c

我有一个视图控制器。视图控制器有一个名为streamController的保留对象,它是一个NSObject子类,用于处理我服务器的所有数据I / O.一切都很好,除了我想弄清楚为什么有些东西在所说的streamController上泄漏了。我在那里放了一个NSLog,我从来没有看到它被解雇。我完全不知道为什么,因为我在我的视图控制器的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永远不会被调用。为什么呢?

1 个答案:

答案 0 :(得分:3)

我相信你只是在泄漏记忆, 如果您的属性具有retain属性,那么您应该看一下以下示例:

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

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

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

如果您检查保留计数,您会看到在A方法中,streamController对象的retainCount为{2},而在B中则只有1。

原因:

在执行[[StreamController alloc] init];时,您的对象在传递给您的财产之前已经有retainCount 1。然后,由于您将其声明为保留,它将被保留,因此retainCount变为2。

在B中基本相同,但是在将对象传递给属性之后才释放它。因此,它以1的retainCount结束。(这就是我们想要的)

在C中,您没有使用该属性,而是直接设置该值。因此它只会被保留一次。在这种情况下这很好,因为是初始化。

如果您确定streamController是nil(比如对象的初始化),我建议使用B或C语言。

希望这有帮助