我正在尝试找出围绕调用委托(delegate)回调进行内存管理的最佳实践。 我过去看到的一个问题是调用委托(delegate)回调可能会导致对象在返回之前被释放,如果对象在调用回调后尝试访问其自己的属性,这可能会导致对象崩溃。
例如,一个对象(例如A
)可能会做这样的事情:
- (void)doStuff
{
[_delegate done];
NSLog(@"msg = %@", _msg);
}
如果调用 done
导致 A
被释放,随后尝试访问 _msg
将导致 BAD_ACCESS 崩溃。
可以通过将 done
的调用延迟到下一个运行循环(例如通过执行 dispatch_async
)来解决这个问题,但这会强制执行我们必须让它异步。或者,我们可以在调用 done
之前保留 self
并在之后立即释放,但这似乎也是一个 hacky 解决方法。有没有人推荐处理此问题的方式?
最佳答案
老实说,我不确定这个问题是否真的与“委托(delegate)”有任何关系,但更多的只是一般的内存管理。
如果您还没有完成某个对象,请确保您仍在“保留”它。完成后“释放”它,不要再访问它。
如果可能的话,也尝试迁移到 ARC,生活会变得更轻松! :)
关于ios - 调用可能导致对象释放的委托(delegate)回调时的正确内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16537706/