Ist der SchwachSelbst / StarkSelbst-Tanz wirklich notwendig, wenn auf sich selbst in einer nicht beibehaltenen Vervollständigung verwiesen wird, die von einem UIViewController aufgerufen wird?
Angenommen, ich habe die folgende Methode in einemUIViewController
Unterklasse:
- (void)makeAsyncNetworkCall
{
[self.networkService performAsyncNetworkCallWithCompletion:^{
dispatch_async(dispatch_get_main_queue(), ^{
[self.activityIndicatorView stopAnimating];
}
});
}];
}
Ich weiß, dass der Verweis aufself
innerhalb des Blocks ergibt sich dieUIViewController
Instanz, die vom Block beibehalten wird. So lange wieperformAsyncNetworkCallWithCompletion
speichert den Block nicht in einer Eigenschaft (oder in einem ivar) auf meinemNetworkService
Habe ich Recht, wenn ich denke, dass es keinen Beibehaltungszyklus gibt?
Mir ist klar, dass diese Struktur dazu führen wird, dass der UIViewController so lange beibehalten wird, bisperformAsyncNetworkCallWithCompletion
beendet, auch wenn es früher vom System freigegeben wurde. Aber es ist wahrscheinlich (oder sogar möglich?), Dass das System meine Zuordnung aufhebtUIViewController
überhaupt (Nach den Änderungen an der Art und Weise verwaltet iOS 6 eineUIViewController
unterstütztCALayer
Erinnerung)?
Wenn es einen Grund gibt, warum ich den "SchwachSelbst / StarkSelbst-Tanz" machen muss, würde das so aussehen:
- (void)makeAsyncNetworkCall
{
__weak typeof(self) weakSelf = self;
[self.networkService performAsyncNetworkCallWithCompletion:^{
typeof(weakSelf) strongSelf = weakSelf;
if (!strongSelf) {
return;
}
dispatch_async(dispatch_get_main_queue(), ^{
[strongSelf.activityIndicatorView stopAnimating];
}
});
}];
}
Aber ich finde das unbeschreiblich hässlich und würde es gerne vermeiden, wenn es nicht nötig ist.