【发布时间】:2023-03-24 16:23:01
【问题描述】:
我在这里发现了很多关于委托技术的问题,并尝试了很多变体,但仍然有 BAD_ACCESS 异常。
我的应用通过 NSUrlConnection 从网络异步接收数据。 我正在使用带有委托给 VC 的特殊数据交换对象。
使用 NSZombies 调试选项,我收到消息:[MyViewController tableView:titleForHeaderInSection:]: message sent to deallocated instance 0x79698490.
VC:
@property DataManager *man;
- (void)viewDidLoad {
...
man = [[DataManager alloc] initWithDelegate:self];
...
}
- (void) myDelegateSelector {
// DataManager call this method when data is ready
... save data ...
_tableView reloadSections ... // refresh content
}
数据管理器:
@property (weak, nonatomic) id <DataManagerDelegate> delegate;
- (id) initWithDelegate:(id <DataManagerDelegate>)delegate {
...
_delegate = delegate;
}
- (void) receiveSomeData {
...
dispatch_async(dispatch_get_global_queue(0, 0), ^{
... receive data work in global queue
if (_delegate)
// going back to the main queue cause need to change on screen data
dispatch_async(dispatch_get_main_queue(), ^{
if ([_delegate respondsToSelector:@selector(myDelegateSelector:)])
[_delegate myDelegateSelector];
});
});
}
【问题讨论】:
-
这意味着你的 MyViewController 在你试图让它做某事时被释放。谁创建/管理您的 MyViewController?您的代码没有显示那是什么控制器。
-
是的,我知道。 VC 由父控制器创建。当用户快速点击“返回”按钮时,数据仍在加载,有时会出现异常。
标签: ios objective-c asynchronous delegates automatic-ref-counting