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.
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