NSOperation没有完全解除分配?尽管操作完成,但实时字节数不低于分配实用程序中的总字节数

时间:2011-04-28 01:04:19

标签: objective-c memory-management concurrency nsoperation grand-central-dispatch

我正在运行大量NSOperation任务,而我的应用程序正在使用大量内存。虽然它应该使用相当多,但它使用的数量超出了应有的程度,而且我正在从Instruments中思考,这是因为NSOperation对象没有被完全解除分配。我的NSOperation子类的代码是这样的:

- (id)initFromNode:(BKObject *)sender withNumber:(NSNumber *)number; {
  self = [super init];
  if (self) {
    _number = [number retain];
    _sender = [sender retain];
  }
  return self;
}
- (void)main {
  [_sender go:_number];
}
- (void)dealloc {
  [_number release];
  _number = nil;
  [_sender release];
  _sender = nil;
  [super dealloc];
}

我的怀疑是这样的,因为在Instruments中,当我使用Allocations实用程序时,它显示了我的_NSOperationInternal以及NSOperation的子类的大量数据,但Live Bytes数字始终是等于总字节数。我还检查了Leaks实用程序,它从未发现任何内存泄漏。在将任何操作对象添加到队列后,我会小心释放它们。

如果它真的完成了,我还会在完成块中测试它,并且我可以确认它们中至少有一些是这样做的。确认所有这些工作会更多,而且仪器中的实时数据会有所下降,即使只有10%的数据正在完成。

我很茫然。如果我对我正在做的事情有任何理解,或者更多代码会有所帮助,请告诉我。你知道可能会发生什么事情,这会占用更多的内存吗?

1 个答案:

答案 0 :(得分:0)

要调试此操作,请尝试查看是否甚至调用了-dealloc。最简单的方法是使用NSLog,正确的方法是断点。

我的猜测是:

  • 您没有正确发布NSOperations
  • 或者你有保留周期。
  • 您的NSOperation 中的某些对象不会被释放,请尝试在主方法周围添加自动释放池。