ios - 调用可能导致对象释放的委托(delegate)回调时的正确内存管理

标签 ios objective-c memory-management delegates

我正在尝试找出围绕调用委托(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/

相关文章:

ios - 如何在滑动时隐藏tableView? swift

ios - 使用 NSFetchedResultsController 在表格顶部插入单元格

objective-c - 在 NSString 对象中查找子字符串

c++ - 如果 new_size 不大于旧的,C++ 标准是否保证 std::string::resize(new_size) 不会导致分配?

c - 如何跟踪对堆上分配的内存块所做的更改

c++ - 内存使用比较

ios - 使用 CALayer 定位按钮不起作用

ios - iOS 上使用尺寸等级的不同 UI

ios - 方向灯

ios - 来自 CMSampleBufferRef 转换的 UIImage,导致 UIImage 无法正确呈现