【问题标题】:weakSelf being deallocated before blockweakSelf 在块之前被释放
【发布时间】:2016-07-11 08:50:58
【问题描述】:

所以不知何故,我的 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 为零。我不确定如何调试它,或者变量如何在使用之前被释放。

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

【问题讨论】:

  • 如果self没有保留块,你为什么要使用weakSelf?
  • 假设handleRequest:bankAccount:completionBlock: 正在做一些异步的事情,还有什么能让limitChecker 活着吗? self 这里是什么?
  • 正如@BryanChen 所说:除非块被self 保留,否则无需使用weak self。块中的weak self 是为了避免保留循环。 (self保留block;block保留self;两者都不能释放)
  • 所以它在除一种情况外的所有情况下都被保留,我试图弄清楚这两种情况之间有什么不同,但我不知道我什至应该寻找什么方向出来
  • 我们无法帮助您弄清楚为什么 self 在没有看到所有周围代码的情况下被释放。当您可以使用上面 cmets 中讨论的强引用时,您不应该花时间试图弄清楚为什么它是 nil。

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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    • 2021-02-16
    • 1970-01-01
    相关资源
    最近更新 更多