我在这里发现了很多关于委托技术的问题,并尝试了很多变种,但仍然有BAD_ACCESS异常。
我的应用程序通过NSUrlConnection以异步方式从网络接收数据。 我使用了一个特殊的数据交换对象和VC的委托。
使用NSZombies调试选项,我收到消息:[MyViewController tableView:titleForHeaderInSection:]:发送到解除分配的实例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
}
的DataManager:
@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];
});
});
}
答案 0 :(得分:0)
在这种情况下,您应该始终在dealloc方法中删除委托。对于您的视图控制器:
-(void)dealloc {
man.delegate = nil;
}
您已经检查过(_delegate)。当VC快速关闭时,如果没有将其设置为nil,则_delegate将被释放,但不会为nil。
答案 1 :(得分:0)
问题成功解决了。
解决方案:
VC代码:
- (void) dealloc
{
_tableview.datasource = nil;
}