Czy taniec weakSelf / strongSelf jest naprawdę niezbędny podczas odwoływania się do self wewnątrz nie zatrzymanego zakończenia wywoływanego z UIViewController?

Powiedz, że mam w środku następującą metodęUIViewController podklasa:

- (void)makeAsyncNetworkCall
{
    [self.networkService performAsyncNetworkCallWithCompletion:^{
        dispatch_async(dispatch_get_main_queue(), ^{
                [self.activityIndicatorView stopAnimating];
            }
        });
    }];
}

Wiem, że odniesienie doself wewnątrz bloku daje wynikUIViewController przykład zatrzymany przez blok. Tak długo jakperformAsyncNetworkCallWithCompletion nie przechowuje bloku we właściwości (lub ivar) na moimNetworkService, mam rację, myśląc, że nie ma cyklu zatrzymania?

Zdaję sobie sprawę, że powyższa struktura doprowadzi do zachowania UIViewController doperformAsyncNetworkCallWithCompletion kończy się, nawet jeśli wcześniej został zwolniony przez system. Ale prawdopodobnie (a nawet możliwe?) System zwolni mojeUIViewController w ogóle (po zmianach w sposobie zarządzania iOS 6UIViewControllerwsparcieCALayer pamięć)?

Jeśli istnieje powód, dla którego muszę wykonać „słaby taniec / silny taniec”, wyglądałoby to tak:

- (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];
            }
        });
    }];
}

Ale uważam to za nieprzyjemnie brzydkie i chciałbym tego uniknąć, jeśli nie jest to konieczne.

questionAnswers(4)

yourAnswerToTheQuestion