我创建了一个使用相机解码条形码的对象。如果成功,它会向下一个动作发送委托消息,如果没有,它只会消失,下一个屏幕开始工作。
如果我在对象的最后一个命令中,我可以发送[自我释放]来释放内存吗?但问题是:retainCount可以多于一个吗?
像
ObjectToDealloc *test = [[ObjectToDealloc alloc] init];
[test doYourJob];
//can't release here, it broke my program
在这个对象的最后一件事中,它运行:
-(void)destroyYourself {
[self release];
[self dealloc];
}
这会有用吗?我会释放记忆吗?或者我必须在全局可见性(不仅是功能可见性)中进行“测试”并执行:
[test release];
答案 0 :(得分:6)
这不是正确的内存管理。 [self release]
正确的情况很少。没有[self dealloc]
是正确的情况(除了你自己dealloc
中的超类之外,你永远不应该打电话给任何人dealloc
。
当你说“它打破了我的程序”时,你的意思是什么? ObjectToDealloc
执行某种后台处理吗?如果没有,那么您应该始终能够在您指示的位置释放它。如果它确实进行后台处理,那么你需要一些东西来保留对象,直到它完成,然后释放它。每隔一段时间,最好的方法是保留并释放self
,但通常你还有其他一些事情就像NSOperationQueue
之类的那样。
这里更可能的问题是你在ObjectToDealloc
中错误地处理了内存管理,并且当它解除分配时崩溃了。什么是崩溃?
要记住的关键是你永远不会在ObjC中说“立即销毁这个物体”。你说“我已经完成了这个对象。”当每个人都完成了对象,然后运行时就会销毁它。
答案 1 :(得分:5)
有几个例子我见过自我保留的课程,以便在他们完成工作之前保持自己。 永远,永远,甚至打电话给DEALLOC *。 Dealloc不适合你,而是运行时。如果您不再需要对象,只需适当地释放它。调用该方法只是运行时的职责。
这是我经常使用的一些代码示例,其中对象保留自身,然后在完成其工作时适当地释放自己:UIAlertView+Blocks此代码执行此操作,因为该对象被认为是坚持,即使在它之后已经由实例化类释放,以便它可以运行并完成它被执行的块。
* 除非在您自己的dealloc中调用super的dealloc,但这不言而喻。