2016-03-23 8 views
3

freigegeben Also irgendwie meine weakSelf Variable wird freigegeben, bevor mein Block eine Chance hat, auszuführen. Dies passiert nur in einem bestimmten Szenario, die anderen Male, die ich diesen Block treffe, funktioniert es gut. Hier ist, was mein Code wie folgt aussieht:weakSelf wird vor dem 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]; 
} 

Durch die Zeit, um es in die weakSelf.navigationController... Linie bekommt, weakSelf Null ist. Ich bin nicht sicher, wie man das debuggt oder wie die Variable freigegeben werden kann, bevor sie überhaupt verwendet wird.

Kennt jemand irgendwelche Szenarien, die gerade jetzt laufen könnten? Oder irgendwelche Tipps, wie ich dieses Problem beheben könnte?

+8

Warum verwenden Sie 'weakSelf', wenn der Block nicht von' self' beibehalten wird? –

+0

Angenommen, 'handleRequest: bankAccount: completionBlock:' macht etwas asynchron, hält irgendwas "limitChecker" am Leben? Was ist "Selbst" hier? –

+0

Wie @BryanChen sagte: Keine Notwendigkeit, _weak self_ zu verwenden, es sei denn, der Block wird von _self_ beibehalten. _weak self_ in Blöcken soll Rückhaltezyklen vermeiden. (_self_ behält _block_; _block_ behält _self_ bei; beide können nicht freigegeben werden) – nielsbot

Antwort

0

Angenommen, Sie haben einen View-Controller, der Benutzer tippt auf eine Schaltfläche, daher senden Sie einige Informationen asynchron an den Server, und Sie sind bereit, die Anfrage zu bearbeiten. Währenddessen wechselt Ihr Benutzer in eine andere Ansicht und Ihr View-Controller wird freigegeben, bevor Ihre Methode zurückkehrt.

Zuerst überlegen, was Sie wollen. Manchmal ist eine Anfrage sinnlos geworden, wenn der View-Controller weg ist. Angenommen, Sie haben eine Website, die Deutsch in Französisch übersetzt. Wenn die Übersetzung zurückkehrt und der View-Controller verschwunden ist, ignorieren Sie einfach das Ergebnis. Aber wenn Sie das Ergebnis verarbeiten müssen, unabhängig davon, ob der View-Controller vorhanden ist oder nicht, müssen Sie Ihren Code neu anordnen, so dass er auch funktioniert, wenn der View-Controller null ist, weil der Benutzer zu einer anderen Ansicht gewechselt hat.