ios - weakSelf 在 block 之前被释放

标签 ios objective-c automatic-ref-counting

所以不知何故,我的 weakSelf 变量在我的 block 有机会执行之前被释放了。这只发生在一个特定的场景中,其他时候我点击这个 block 它工作正常。这是我的代码的样子:

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

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

最佳答案

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

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

关于ios - weakSelf 在 block 之前被释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36188755/

相关文章:

ios - ARC - 当 UIViewController 设置为 nil 时是否处理手势识别器和 KVO?

ios - 标记位码(-fembed-bitcode-marker)的意义是什么?

ios - 如何让 UICollectionViewCell 成为设备的整个宽度?

Objective-C/ cocoa : get key code

ios - 检查 SKAction 是否正在运行

c++ - ARC 和 C++ 对象内的 Objective C 对象会发生什么?

swift - 惰性初始化和保留周期

ios - 托管内容对应用内购买有何好处?

ios - 删除sqlite的WAL文件安全吗?

ios - 不推荐使用 initForReadingWithData - initForReadingFromData 返回 nil