【发布时间】: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