我试图找出围绕调用委托回调的内存管理的最佳实践。我过去看到的一个问题是,调用委托回调可能会导致对象在返回之前被释放,如果对象在调用回调后尝试访问自己的属性,这可能会导致对象崩溃。
例如,一个对象(例如A
)可能会做这样的事情:
- (void)doStuff
{
[_delegate done];
NSLog(@"msg = %@", _msg);
}
如果调用done
导致A
被释放,则随后的访问尝试_msg
将导致 BAD_ACCESS 崩溃。
可以通过延迟调用done
直到下一个运行循环(例如通过执行 a dispatch_async
)来解决这个问题,但这将迫使我们不得不使其异步。或者,我们可以self
在调用之前保留done
并在之后立即释放,但这似乎也是一个 hacky 解决方法。有没有人推荐处理这个问题的风格?