在目标C(iOS)中的多步骤清理中延迟[super dealloc]调用?
在Objective-C中,将对在目标C(iOS)中的多步骤清理中延迟[super dealloc]调用?,ios,objective-c,Ios,Objective C,在Objective-C中,将对[super dealloc]的调用推迟到某个多步骤清理完成后,是非法的,还是必须在dealloc期间始终调用[super dealloc](或者根本不调用) 比如说, - (void)dealloc { // Pretend this returns immediately and results in a call // to OnAsynchronousShutdownProcessDone some time later: StartAsyn
[super dealloc]
的调用推迟到某个多步骤清理完成后,是非法的,还是必须在dealloc
期间始终调用[super dealloc]
(或者根本不调用)
比如说,
- (void)dealloc
{
// Pretend this returns immediately and results in a call
// to OnAsynchronousShutdownProcessDone some time later:
StartAsynchronousShutdownProcess();
}
- (void) OnAsynchronousShutdownProcessDone()
{
// Let's assume the worst and pretend we might even be on
// a different thread here.
[super dealloc];
}
允许这样做吗?如果没有,有哪些替代方法
编辑:为了提供一些上下文,这涉及到关闭与以该对象为目标的外部库的交互(作为void*,但所有这些都是一样的,引用这个)。只有当我们收到“交互完成”消息时,我们才知道其他任何东西都不会以该对象为目标。换言之,停机涉及请求/响应。可能有很多方法可以做到这一点,但如果我们可以将[super dealoc]延迟到从外部库获得响应,那就很简单了。不幸的是,这在两种可能的情况下都是非法的:
- 在ARC中,您甚至不再指定何时调用
,而是由运行时为您管理。禁止您显式发送[super dealloc]
,甚至禁止发送到-dealloc
超级
- 在ARC之外,
的文档说明: …dealloc的实现必须调用超类的实现作为其最后一条指令-[NSObject dealloc]
不幸的是,这在两种可能的情况下都是非法的:
- 在ARC中,您甚至不再指定何时调用
,而是由运行时为您管理。禁止您显式发送[super dealloc]
,甚至禁止发送到-dealloc
超级
- 在ARC之外,
的文档说明: …dealloc的实现必须调用超类的实现作为其最后一条指令-[NSObject dealloc]
我想,这是非圆弧的。我坚信你不能那样做。它很可能会崩溃。一旦
dealloc
方法进入,运行时就会假定没有其他(强)引用会(从另一个线程)向其发送消息
在ARC中,您将在客户端库上使用弱指针。在调用dealloc
方法时访问弱指针将返回nil
值
最好引入某种
invalidate
方法,一旦库不再需要该对象,就会调用该方法。然后,您可以在方法invalidate
中释放对象,该方法最终解除对象的分配。我假设,这是针对非ARC的。我坚信你不能那样做。它很可能会崩溃。一旦dealloc
方法进入,运行时就会假定没有其他(强)引用会(从另一个线程)向其发送消息
[super dealloc]
在ARC中,您将在客户端库上使用弱指针。在调用dealloc
方法时访问弱指针将返回nil
值
最好引入某种invalidate
方法,一旦库不再需要该对象,就会调用该方法。然后,您可以在方法invalidate
中释放该对象,该方法最终将释放该对象
[super dealloc]
在使用手动引用计数(非延迟)时,必须在dealloc方法期间调用,并且在使用ARC时,不得调用
一旦dealloc方法返回,对象的内存就会释放,因此稍后尝试调用[super dealloc]会导致崩溃
在ARC代码中,您根本不应该调用super[super dealloc]
在使用手动引用计数(非延迟)时,必须在dealloc方法期间调用,并且在使用ARC时,不得调用
一旦dealloc方法返回,对象的内存就会释放,因此稍后尝试调用[super dealloc]会导致崩溃
在ARC代码中,您根本不应该调用super[super dealloc]。如果您能够描述您试图解决的实际问题,这会有所帮助。你在用这个异步进程清理什么?@Caleb请看上面的编辑,谢谢。如果你能描述一下你试图解决的实际问题,那会有帮助的。你在用这个异步进程清理什么?@Caleb请参阅上面的编辑,谢谢。