我正在使用NSOperation
来处理iOS应用中的后台处理,我正在尝试了解目标/操作模式。在委托模式中,委托被保存为弱引用,委托对象负责在dealloc
之前将另一个对象的委托字段设置为nil。在目标/行动模式中,据我所知,由于类似的原因,目标被视为弱参考。但是,当目标对象nil
s“dealloc
”目标字段时,似乎并不容易,并且NSOperation
s可能仍然可以进行操作在目标被解除分配时在队列中。
在这种情况下如何处理内存管理(NSOperation
执行后台处理,然后使用目标/操作将值返回给NSOperation
的创建者?
答案 0 :(得分:1)
如The Target中所述,如果控件可能发送操作,则由您确保目标可用。在实践中,这不是问题,因为目标通常是在控件之前创建并在控件之后取消分配的控制器。
如果您要从操作发送操作消息,则需要确保在操作完成之前不会释放目标。一种方法可能是让目标保持自己直到操作完成。
另一种方法可能是使用操作和目标都知道的中间对象。该操作可以将中间对象视为目标的代理并将操作发送给它而不是将其直接发送到目标,并且如果解除分配,则目标可以适当地更新中间对象。目标和操作都可以保留中间体而不创建保留循环。我不确定这种方法是我的第一选择 - 看起来有点过于复杂 - 但它可能有所帮助。
答案 1 :(得分:0)
UIControl获取目标的__weak引用,因此目标操作方法不会更改目标的生命周期。
NSTimer采用__strong目标引用,在NSTimer Object dealloc之前,目标不会被释放。这可能会导致保留圈。