Objective c 还是[自我释放]工作?

Objective c 还是[自我释放]工作?,objective-c,cocoa-touch,Objective C,Cocoa Touch,我制作了一个用相机解码条形码的物体。如果成功,它会向下一个操作发送一条代理消息,如果不成功,它只会熄灭,下一个屏幕开始工作 如果我是该对象的最后一个命令,我可以发送[自我释放]来释放内存吗?但是,问题是:重新计数可能不止一个 像 在该对象执行的最后一项操作中,它运行: -(void)destroyYourself { [self release]; [self dealloc]; } 这样行吗?我会释放记忆吗?或者我必须在全局可见性(不仅仅是功能可见性)中进行“测试

我制作了一个用相机解码条形码的物体。如果成功,它会向下一个操作发送一条代理消息,如果不成功,它只会熄灭,下一个屏幕开始工作

如果我是该对象的最后一个命令,我可以发送[自我释放]来释放内存吗?但是,问题是:重新计数可能不止一个

在该对象执行的最后一项操作中,它运行:

  -(void)destroyYourself {
     [self release];
     [self dealloc];
  }
这样行吗?我会释放记忆吗?或者我必须在全局可见性(不仅仅是功能可见性)中进行“测试”,并执行以下操作:

   [test release];

有几个例子,我看到类保留它们自己,以便在执行工作之前保持它们自己永不,永不,永不调用DEALLOC*DEALLOC不适合您,而是运行时。如果您不再需要某个对象,只需适当地释放它即可。调用该方法只是运行时的职责

下面是我经常使用的一些代码的示例,其中对象保留自己,然后在完成其工作时适当地释放自己:这段代码之所以这样做,是因为即使实例化类释放了对象,该对象仍然会保持不变,以便它可以运行并完成它要执行的块


*除了在自己的dealloc中调用super的dealloc之外,这是不言而喻的。

在一些实例中,我看到类保留它们自己,以便在执行工作之前保持它们自己永不,永不,永不调用DEALLOC*DEALLOC不适合您,而是运行时。如果您不再需要某个对象,只需适当地释放它即可。调用该方法只是运行时的职责

下面是我经常使用的一些代码的示例,其中对象保留自己,然后在完成其工作时适当地释放自己:这段代码之所以这样做,是因为即使实例化类释放了对象,该对象仍然会保持不变,以便它可以运行并完成它要执行的块


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

这不是正确的内存管理。只有少数情况下
[自释放]
是正确的。在任何情况下,
[self dealloc]
都是正确的(除了您自己的
dealloc
中的超类之外,您不应该调用任何人的
dealloc

当你在上面说“它破坏了我的程序”时,你是什么意思?
ObjectToDealloc
是否执行某种后台处理?如果没有,那么您应该始终能够在指定的点释放它。如果它确实进行了后台处理,那么您需要一些东西来保留对象,直到它完成,然后再释放它。通常情况下,最好的方法是保留和释放
self
,但通常需要做一些其他事情,如
NSOperationQueue
或类似的事情

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


要记住的关键一点是,在ObjC中永远不要说“立即销毁此对象”。你说“我处理完这个对象了”。当每个人都处理完这个对象时,它就会被运行时销毁。

这不是正确的内存管理。只有少数情况下
[自释放]
是正确的。在任何情况下,
[self dealloc]
都是正确的(除了您自己的
dealloc
中的超类之外,您不应该调用任何人的
dealloc

当你在上面说“它破坏了我的程序”时,你是什么意思?
ObjectToDealloc
是否执行某种后台处理?如果没有,那么您应该始终能够在指定的点释放它。如果它确实进行了后台处理,那么您需要一些东西来保留对象,直到它完成,然后再释放它。通常情况下,最好的方法是保留和释放
self
,但通常需要做一些其他事情,如
NSOperationQueue
或类似的事情

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


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

我认为Clang团队提出了一个错误,用它来标记
[self dealloc]
-我们在酒吧调试朋友的代码时发现了这个错误。这会省去很多麻烦。我认为Clang团队在标记
[self dealloc]
的使用时出现了一个bug-我们在酒吧调试朋友的代码时发现了这一点。这样可以省去很多麻烦。
   [test release];