11

Czy potrzebujemy używać __weak self wewnątrz bloków UIAnimation jak podano poniżej? Czy stworzy on problem z utrzymaniem cyklu, jeśli nie określimy siebie jako słabego?Czy musimy używać __weak self wewnątrz UIAnimationBlocks w ARC?

[UIView animateWithDuration:animationDuration 
         delay:0 
        options:UIViewAnimationCurveEaseInOut 
       animations:^{ 
     [self doSomething]; 
    } completion:^(BOOL finished) { 
     if (finished) { 
      [self doSomething]; 
     } 
    }]; 

Jestem również zdezorientowany w następującym scenariuszu. Jakieś przemyślenia na ten temat? proszę, podziel się swoimi komentarzami.

[self.navController dismissViewControllerAnimated:animated 
             completion:^{ 
                 [self doSomething]; 
                }]; 

Czy powinniśmy używać tutaj słabego ja?

+0

Dziękuję wam, coraz wyraźniej i jaśniej. Chciałbym omówić również następującą sprawę. [self.navController dismissViewControllerAnimated: animowane zakończenie:^{ [self doSomething]; }]; –

Odpowiedz

23

To nie jest cykl zatrzymywania. Cykl zachować byłoby

self -> block -> self 

W tym przypadku mamy

animation framework -> block 
block -> self 

gdzie pierwsza zachować to tylko tymczasowe - blok zostanie wydana, gdy animacja kończy. Nawet jeśli dojdzie do zatrzymania cyklu, będzie to tylko tymczasowe i nie zapobiegnie dezalokacji obiektu.

+0

Co z następującym przypadkiem nieważności (^ animateBlock) (void) =^(void) { [self doSomething]; }; –

+0

@ arango_86 To ta sama sprawa, którą napisałeś w swoim pytaniu. Aby utworzyć cykl zatrzymywania, musisz najpierw utworzyć właściwość na obiekcie, np. '@property (nonatomic, copy) void (^ animateBlock) (void)', a następnie przypisz do niego 'self.animationBlock =^(void) {[self doSomething]; }; '. – Sulthan

+0

Używanie słabego ja w animacji jest nadal dobre, więc nie uniemożliwi zwolnienia kontrolera widoku, gdy zniknie z widoku - i nie ma sensu wykonywanie animacji, gdy kontroler widoku nie jest już widoczny. – Boon

1

Nie, nie utworzy cyklu zatrzymania, ponieważ blok (zamknięcie) nie jest dołączony do self.
Aby uzyskać więcej informacji, odwiedź stronę Apple Automatic Reference Counting.

2

Musisz użyć __weak, gdy możliwy jest cykl zatrzymania. Jest to nie, ponieważ blok animacji nie jest zatrzymywany samodzielnie.

Inną sytuacją do zastosowania __weak jest przedłużona akcja, która wywoła nasz blok po zakończeniu i self może zostać zwolniony podczas tej akcji. Na przykład, niektóre żądania sieciowe wywołają aktualizację interfejsu dla naszego kontrolera widoku w bloku zakończenia. Użytkownik może opuścić nasz ekran podczas żądania. W tej sytuacji nie ma potrzeby zatrzymywania self z blokiem, lepiej jest używać słabego ja. Ale korzystanie z bloków animacji to także ta sytuacja w przypadku , a nie.

Powiązane problemy