使用异步回调进行委派

时间:2014-09-19 15:17:42

标签: ios objective-c asynchronous delegates automatic-ref-counting

我在这里发现了很多关于委托技术的问题,并尝试了很多变种,但仍然有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];
            });
    });
}

2 个答案:

答案 0 :(得分:0)

在这种情况下,您应该始终在dealloc方法中删除委托。对于您的视图控制器:

-(void)dealloc {
    man.delegate = nil;
}

您已经检查过(_delegate)。当VC快速关闭时,如果没有将其设置为nil,则_delegate将被释放,但不会为nil。

答案 1 :(得分:0)

问题成功解决了。

解决方案:

VC代码:

- (void) dealloc 
{
  _tableview.datasource = nil;
}