11

Dobbiamo usare __weak self all'interno di UIAnimation Blocks come indicato di seguito? Se creerà il problema del ciclo di conservazione se non stiamo specificando il sé come debole?Abbiamo bisogno di usare __weak self all'interno di UIAnimationBlocks in ARC?

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

Sono anche confuso nel seguente scenario. Qualche idea su questo? per favore condividi i tuoi commenti

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

Dovremmo usare il sé debole qui?

+0

Grazie ragazzi, sto diventando sempre più chiaro. Vorrei discutere anche del seguente caso. [self.navController dismissViewControllerAnimated: completamento animato:^{ [self doSomething]; }]; –

risposta

23

Questo non è un ciclo di conservazione. Un ciclo trattenere sarebbe

self -> block -> self 

In questo caso abbiamo

animation framework -> block 
block -> self 

dove il primo trattenere è solo temporanea - il blocco viene rilasciato quando l'animazione termina. Anche se si verifica un ciclo di conservazione, sarà solo temporaneo e non impedirà la deallocazione dell'oggetto.

+0

Che dire del seguente caso void (^ animateBlock) (void) =^(void) { [self doSomething]; }; –

+0

@ arango_86 È lo stesso caso che hai scritto nella tua domanda. Per creare un ciclo di conservazione, devi prima creare una proprietà sul tuo oggetto, ad es. '@property (nonatomic, copy) void (^ animateBlock) (void)' e quindi assegna ad esso 'self.animationBlock =^(void) {[self doSomething]; }; '. – Sulthan

+0

L'utilizzo dell'auto debole all'interno dell'animazione è comunque valido, in modo che non impedisca il rilascio del controller di visualizzazione quando non è visibile, e non ha senso eseguire l'animazione quando il controller di visualizzazione non è più visibile. – Boon

1

No, non creerà un ciclo di conservazione, perché il blocco (chiusura) non è collegato a self.
Per ulteriori informazioni, consultare Apple Automatic Reference Counting.

2

È necessario utilizzare __weak quando è possibile il ciclo di mantenimento. Questo è non in questo caso perché il blocco di animazioni non viene mantenuto da solo.

Un'altra situazione da utilizzare __weak è un'azione prolungata che chiamerà il nostro blocco dopo il completamento e self può essere deallocato durante questa azione. Ad esempio, alcune richieste di rete chiameranno l'aggiornamento dell'interfaccia per il nostro controller di visualizzazione nel blocco di completamento. L'utente può uscire dalla schermata durante la richiesta. In questa situazione non è necessario mantenere self con un blocco, è meglio usare il sé debole. Ma l'uso di blocchi di animazione è non anche questa situazione.

Problemi correlati