5

Supponiamo di avere una semplice chiamata dispatch_async(self.queue, ^{ /* Empty */ }), dove self.queue è una coda creata in precedenza.L'invio a una coda di proprietà di un oggetto mantiene quell'oggetto?

Does self ottenere trattenuto dal blocco, in questo caso, visto che non v'è alcun riferimento selfall'interno il blocco, ma solo come parametro per dispatch_async()?

+1

Che cosa significa "si ottiene il blocco automatico per blocco"? Vuoi dire, "viene mantenuta l'auto perché sto passando la coda a dispatch_async?" – Wain

risposta

0

No, self non verrà mantenuto se il blocco non ha (a) alcun riferimento esplicito a self; né (b) eventuali riferimenti impliciti a self generati facendo riferimento a qualsiasi variabile di istanza di self. La presenza di self.queue nell'invocazione di dispatch_async non causerà il suo mantenimento. È ciò che conta nel blocco.

Questo è abbastanza facile da dimostrare. Immaginate un controller di vista la cui realizzazione sembra:

@interface SecondViewController() 
@property (nonatomic, strong) dispatch_queue_t queue; 
@end 

@implementation SecondViewController 

- (void)dealloc 
{ 
    NSLog(@"%s", __FUNCTION__); 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.queue = dispatch_queue_create("com.stackoverflow.17306228", 0); 

    void (^block)(void) = ^(void){ 
     sleep(10); 

     NSLog(@"%s", __FUNCTION__); 
    }; 

    dispatch_async(self.queue, block); 
} 

@end 

Se si spinge a scene di questo controller di vista, e quindi premere immediatamente il pulsante "indietro" per farla fuori, vedrete il controller della vista immediatamente deallocata, e il blocco continuerà ad essere eseguito. Ma se aggiungi una variabile o una proprietà di istanza di classe allo block, vedrai il controller di visualizzazione conservato fino a dopo il completamento del blocco.

2

OK, così documenti mela afferma che

La coda viene trattenuto dal sistema finché il blocco è stato eseguito a completamento.

Così coda verrà trattenuta dal sistema finché il blocco completa l'esecuzione, ma il self non sarà trattenuto in questo caso.

Grazie a @Wain per aver segnalato il mio errore nella versione precedente di questa risposta.

+1

In che modo il mantenimento della coda comporta un mantenimento di "sé"? – Wain

+0

Probabilmente ho usato le parole sbagliate in questo contesto, 'self' non può essere rilasciato/dealato fino a quando la coda non viene rilasciata. Correggimi se sbaglio. – danypata

+1

Certo che può. La coda può continuare ad esistere senza 'self'. Il sistema è la cosa che mantiene "il" riferimento persistente alla coda. – Wain

Problemi correlati