Słabe odniesienia w blokach i zachowują cykle
W tym pytaniu, Zapytałem o następujący kod i zachowuję cykle:
__weak Cell *weakSelf = self;
NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
UIImage *image = /* render some image */
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[weakSelf setImageViewImage:image];
}];
}];
[self.renderQueue addOperation:op];
Wszystkie odpowiedzi wskazują, że użycie słabego odniesienia tutaj nie było konieczne, ponieważ ten kod nie skutkuje zatrzymaniem cyklu. Jednakże, podczas eksperymentowania z jakimś kodem, następujące czynności powodują cykl zachowywania (jeśli nie używam słabego odniesienia, bieżący kontroler widoku nie jest zwolniony)
//__weak ViewController *weakSelf = self;
MBItem *close = [[MBItem alloc] initWithBlock:^{
[self dismissModalWithDefaultAnimation:NO];
}];
NSMutableArray *items = [[NSMutableArray alloc] initWithObjects:close, nil];
[self.childObject setItems:items];
Dlaczego drugi spowodowałby utrzymanie cyklu, ale nie pierwszego?