12

(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?

+1

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

+2

Provalo. Il compilatore non ti lascerà se non è necessario (non lo è). –

+1

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

risposta

7

No, a condizione che la destinazione di distribuzione è iOS 6.0 o Mac OS X 10.8 o versioni successive, come spiegato here.

oggetti Tutti GCD sono gestiti da ARC, quindi non c'è bisogno di gestire in modo esplicito la loro memoria. Ciò che è vero per dispatch_queue_t si applica anche a tutti gli altri oggetti GCD.

Questo è documentato in <os/object.h> proprio sopra la definizione di OS_OBJECT_HAVE_OBJC_SUPPORT.

Per impostazione predefinita, libSystem oggetti come GCD e XPC oggetti vengono dichiarati come tipi Objective-C quando si costruisce con un compilatore Objective-C. Ciò consente loro di partecipare ad ARC, nella gestione di RR da parte del runtime Blocks e nel controllo delle perdite dall'analizzatore statico e consente di aggiungerle alle raccolte Cocoa.

È inoltre possibile disattivare questo comportamento utilizzando il flag del compilatore -DOS_OBJECT_USE_OBJC=0.

1

Ecco direttiva del compilatore per aggiungere al codice.

// If GCD objects are treated as Objective C object then we do not need to call dispatch_release on those GCD object. 
// Checking if OS_OBJECT_HAVE_OBJC_SUPPORT == 0 ensures we are only releasing GCD objects when they are NOT being treated as Objective C objects. 
#if OS_OBJECT_HAVE_OBJC_SUPPORT == 0 
    dispatch_release(timer); 
#endif 
Problemi correlati