Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/94.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在目标C(iOS)中的多步骤清理中延迟[super dealloc]调用?_Ios_Objective C - Fatal编程技术网

在目标C(iOS)中的多步骤清理中延迟[super dealloc]调用?

在目标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

在Objective-C中,将对
[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之外,
    -[NSObject dealloc]
    的文档说明:

    …dealloc的实现必须调用超类的实现作为其最后一条指令


不幸的是,这在两种可能的情况下都是非法的:

  • 在ARC中,您甚至不再指定何时调用
    [super dealloc]
    ,而是由运行时为您管理。禁止您显式发送
    -dealloc
    ,甚至禁止发送到
    超级
  • 在ARC之外,
    -[NSObject dealloc]
    的文档说明:

    …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请参阅上面的编辑,谢谢。