或[自我dealloc]工作?

时间:2011-06-01 19:36:08

标签: objective-c cocoa-touch

我创建了一个使用相机解码条形码的对象。如果成功,它会向下一个动作发送委托消息,如果没有,它只会消失,下一个屏幕开始工作。

如果我在对象的最后一个命令中,我可以发送[自我释放]来释放内存吗?但问题是:retainCount可以多于一个吗?

  ObjectToDealloc *test = [[ObjectToDealloc alloc] init];
  [test doYourJob];
  //can't release here, it broke my program

在这个对象的最后一件事中,它运行:

  -(void)destroyYourself {
     [self release];
     [self dealloc];
  }

这会有用吗?我会释放记忆吗?或者我必须在全局可见性(不仅是功能可见性)中进行“测试”并执行:

   [test release];

2 个答案:

答案 0 :(得分:6)

这不是正确的内存管理。 [self release]正确的情况很少。没有[self dealloc]是正确的情况(除了你自己dealloc中的超类之外,你永远不应该打电话给任何人dealloc

当你说“它打破了我的程序”时,你的意思是什么? ObjectToDealloc执行某种后台处理吗?如果没有,那么您应该始终能够在您指示的位置释放它。如果它确实进行后台处理,那么你需要一些东西来保留对象,直到它完成,然后释放它。每隔一段时间,最好的方法是保留并释放self,但通常你还有其他一些事情就像NSOperationQueue之类的那样。

这里更可能的问题是你在ObjectToDealloc中错误地处理了内存管理,并且当它解除分配时崩溃了。什么是崩溃?

要记住的关键是你永远不会在ObjC中说“立即销毁这个物体”。你说“我已经完成了这个对象。”当每个人都完成了对象,然后运行时就会销毁它。

答案 1 :(得分:5)

有几个例子我见过自我保留的课程,以便在他们完成工作之前保持自己。 永远,永远,甚至打电话给DEALLOC *。 Dealloc不适合你,而是运行时。如果您不再需要对象,只需适当地释放它。调用该方法只是运行时的职责。

这是我经常使用的一些代码示例,其中对象保留自身,然后在完成其工作时适当地释放自己:UIAlertView+Blocks此代码执行此操作,因为该对象被认为是坚持,即使在它之后已经由实例化类释放,以便它可以运行并完成它被执行的块。

* 除非在您自己的dealloc中调用super的dealloc,但这不言而喻。