gpt4 book ai didi

objective-c - 在委托(delegate)回调期间应该如何延长委托(delegate)对象的生命周期?

转载 作者:太空狗 更新时间:2023-10-30 03:45:36 24 4
gpt4 key购买 nike

我将把一个非常常见的情况提炼成一个一般形式。假设我正在构建一些关闭的库对象,执行一些异步工作,然后在完成时回调到委托(delegate)方法。现在,还出于某种任意原因说我不能使用 ARC 或 block 进行回调。这是老式的。我们称这个对象为 Worker。

现在假设各种应用程序中还有其他几个类,除了其公共(public)接口(interface)外,它们对 Worker 一无所知。他们利用 worker 达到他们自己的目的。我们称这些类为消费者。

假设 Worker 像这样进行委托(delegate)回调:

// "Private" method called internally when work is done.
- (void)somethingFinished
{
[self.delegate workerDidFinish];
[self someTask];
}

假设某个特定的消费者像这样处理回调:

- (void)workerDidFinish
{
// Assume "worker" is a retain property to a Worker
// instance that we previously created and began working,
// and that it's also the sender of the message.
self.worker = nil;
// Other code...
}

现在,如果没有其他东西保留那个特定的 Worker 实例,我们就有麻烦了。 Worker 将被释放,然后控制将返回到它的 -somethingFinished 方法,然后它将 -someTask 发送到回收或垃圾内存,并可能崩溃。没有人公然违反任何内存管理规则。

我不是在这里寻求技术解决方案。我知道几种选择。我想知道修复的责任落在谁身上。作为组件设计者,我是否应该实现 Worker 的 -somethingFinished 方法,以便在使用类似 [[self retain] autorelease] 的方法期间延长 Worker 的生命周期一开始?或者,作为组件的使用者,我是否应该意识到我可能会在实例方法中途吹走一个对象,然后等到稍后再释放它?

This question的答案似乎都表明从回调中释放对象是一个坏主意。不幸的是,在这个问题中有很多分散注意力的信息,关于 worker (在本例中为 CLLocationManager)究竟是如何传递给我在这里有意避免的委托(delegate)的。 This question遇到同样的情况,并提供了另一种解决方案。

就我个人而言,我不明白消费者如何承担责任。它没有违反任何内存管理规则,并且礼貌地使用了 Worker 的公共(public)接口(interface)。它只是在不再需要时释放一个实例。但另一方面,这是否意味着任何可能以某种方式在方法中期被释放的对象都需要人为地延长其自身的生命周期?毕竟,委托(delegate)方法并不是消息发送者最终可能在方法中间释放的唯一方式。

那么最终,谁负责修复? worker ?消费者?可以规范地确定吗?

最佳答案

我认为这个例子中的负担在 Worker 身上。我看到的问题是 Worker 对象在告诉它的 Consumer 它的工作已经完成后正在内部做一些事情。 Worker 只是为了 Consumer 而存在,所以如果满足了 Consumer 的目标,为什么 Worker 仍然在做一些对 Consumer 没有值(value)的事情?如果在“消耗性”工作完成后有内部任务需要完成,那么这些任务不适合放置在 Worker 对象的实例中,但可能应该由一个不太易变的库类拥有的另一个内部对象来完成不会被消费者的行为释放。

关于objective-c - 在委托(delegate)回调期间应该如何延长委托(delegate)对象的生命周期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13463467/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com