weakSelf在被阻止之前被解除分配

时间:2016-03-23 21:11:07

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

所以我的weakSelf变量在我的块有机会执行之前被解除分配。这只发生在一个特定的情况下,其他时候我点击这个块它工作正常。这是我的代码的样子:

__weak typeof(self) weakSelf = self;
DBTEligibleAccountFetcher *accountFetcher = [[DBTEligibleAccountFetcher alloc] init];
NSArray *eligibleDepositAccounts = [accountFetcher fetchDepositEligibleAccounts];
if(eligibleDepositAccounts.count == 1) {
    DBTDepositAmountLimitsHandler *limitChecker = [[DBTDepositAmountLimitsHandler alloc] init];
    [limitChecker handleRequest:self.navigationController bankAccount:eligibleDepositAccounts.firstObject completionBlock:^(DBDepositCheckAccountLimits *limitDetails) {
        containerController.limitDetails = limitDetails;
        [weakSelf.navigationController handleNewRootPush:containerController withCompletion:completionBlock animated:YES];
    }];
} else {
    [self.navigationController handleNewRootPush:containerController withCompletion:completionBlock animated:YES];
}

当它到达weakSelf.navigationController...行时,weakSelf为零。我不确定如何调试这个或者变量如何在它被使用之前被释放。

有谁知道现在可能发生的任何情况?或者有关如何调试此问题的任何提示?

1 个答案:

答案 0 :(得分:0)

假设您有一个视图控制器,用户点击一个按钮,因此您可以异步地向服务器发送一些信息,并且您准备在请求返回时进行处理。同时,您的用户切换到另一个视图,并在您的方法返回之前取消分配视图控制器。

首先考虑一下你想要发生的事情。如果视图控制器消失,有时请求变得毫无意义。假设您有一个将德语翻译成法语的网站。如果翻译恢复并且您的视图控制器消失了,您只需忽略结果。但是,如果您必须处理结果,无论视图控制器是否存在,那么您需要重新排列代码,以便即使视图控制器为零也可以工作,因为用户切换到了不同的视图。