(Ma questa domanda è totalmente diverso)Devo mai chiamare dispatch_release sotto ARC?
Questo esempio di codice non-ARC imposta un timer GCD-based e si chiede dispatch_release per un oggetto dispatch_source_t:
__block BOOL done = NO;
dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue());
if (timer) {
uint64_t milliseconds = 100ull;
uint64_t interval = milliseconds * NSEC_PER_MSEC;
uint64_t leeway = 10ull * NSEC_PER_MSEC;
__block typeof(self) _self = self;
dispatch_source_set_timer(timer, dispatch_walltime(NULL, 0), interval, leeway);
dispatch_source_set_event_handler(timer, ^{
//[_progressBar setProgress:exportSession.progress animated:YES];
if (done) {
dispatch_source_cancel(timer);
dispatch_release(timer);
_self.exportingMovieLabel.hidden = YES;
_self.exportingProgress.hidden = YES;
}
});
dispatch_resume(timer);
}
ho imparato che si fa non è necessario rilasciare gli oggetti nella coda sotto ARC. Ma altri oggetti GCD come una fonte di spedizione?
La "domanda duplicata" dichiarata non è nemmeno chiusa. Le risposte parlano specificamente delle code GCD. Questa domanda chiede in particolare se questo è vero per altri oggetti GCD. – openfrog
Provalo. Il compilatore non ti lascerà se non è necessario (non lo è). –
In base alla mia esperienza, la documentazione di Apple menziona sempre che è necessario gestire i rilasci necessari. Di solito, ci sono funzioni specifiche per fare il rilascio. In questo caso, leggendo i documenti, sembra che dipenda dall'uso se devi gestire tu stesso il rilascio. Prendo questo per dire se usi dispatch_retain e tieni premuto su un puntatore, dovrai rilasciarlo da solo. Non ho usato questa funzione, quindi, prendi questo con un pizzico di sale. –