如何在委托回调期间扩展委托者对象生命周期?

Mat*_*ing 6 memory-management objective-c object-lifetime

我将把一个非常普遍的情况提炼成一般形式.假设我正在构建一些关闭的库对象,执行一些异步工作,然后在完成时回调委托方法.现在,也有一些随意的说法,我不能使用ARC或块来进行回调.这是老式的.我们将此对象称为Worker.

现在说各种应用程序中还有其他几个类,除了公共接口之外,它们对工作程序一无所知.他们将工人用于自己的目的.我们将这些类称为消费者.

Say Worker使委托回调如下:

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

并说一些特定的Consumer处理回调如下:

- (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...
}
Run Code Online (Sandbox Code Playgroud)

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

我不是在这里要求技术解决方案.我知道几种选择.我想知道修复责任的负担是谁.作为组件设计者,我是否应该实现Worker的-somethingFinished方法,以便在方法的持续时间内扩展工作者的生命周期[[self retain] autorelease]?或者,作为组件的使用者,我是否应该知道我可能会在实例方法中途吹走一个对象,并等到稍后才释放它?

这个问题的答案似乎都表明从回调中释放对象是一个坏主意.不幸的是,在这个问题中有很多令人分心的信息,关于如何将Worker(这个实例中的CLLocationManager)传递给我在这里故意避免的委托.这个问题遇到了同样的情况,并提供了另一种解决方案.

就个人而言,我看不出消费者如何承担责任.它没有破坏任何内存管理规则,并且礼貌地消耗了Worker的公共接口.它只是在不再需要时释放一个实例.但另一方面,这是否意味着任何可能以某种方式在中间方法解除分配的对象需要人为地延长其自身的寿命?毕竟,委托方法不是消息发送方最终在方法中间解除分配的唯一方法.

最终,谁负责修复?工人?消费者?可以通过规范来确定吗?

Ram*_*uri 0

当委托收到通知时,应该开始观察工作人员并仅在 SomethingFinushed 方法终止时释放它。