【问题标题】:Why is dealloc for my class not being called?为什么我的班级的 dealloc 没有被调用?
【发布时间】:2010-08-12 07:14:21
【问题描述】:

我有一个视图控制器。视图控制器有一个名为 streamController 的保留对象,它是一个 NSObject 子类,用于处理与我的服务器的所有数据 I/O。一切都很好,除了我试图弄清楚为什么有些东西在所说的流控制器上泄漏。我把一个 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 永远不会被调用。为什么?

【问题讨论】:

  • streamController 设置在哪里?
  • 你用过streamController 后会释放它吗? *没关系,您已经更新了代码
  • 是的,当视图控制器被释放时。查看帖子中的第一个 dealloc
  • 是 NSLog(@"dealloc 视图控制器");被叫?否则我认为您不会发布该视图控制器?
  • 是的,我看到记录到控制台,但不是 streamController 的

标签: iphone objective-c


【解决方案1】:

我相信你只是在泄漏内存, 如果您的属性具有保留属性,那么您应该查看以下示例:

//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。

原因:

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

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

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

如果您确定 streamController 为 nil(如对象的初始化),我会建议使用 B 或 C

希望对你有帮助

【讨论】:

  • 哇。我不知道 self.x = [[whatever alloc]init]; 之间有区别和 x = [[whatever alloc]init];这似乎真的很愚蠢。谢谢!
  • 是的:foo.x = whatever 实际上编译为[self setX:whatever](前提是 foo 是一个 Objective-C 对象)。
猜你喜欢
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 2015-04-06
  • 2016-06-03
  • 2018-07-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多