12

(Aber diese Frage ist völlig anders)Muss ich jemals dispatch_release unter ARC aufrufen?

Dieses nicht-ARC Codebeispiel setzt einen GCD-basierten Timer und es ruft dispatch_release für ein dispatch_source_t Objekt:

__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); 
    } 

ich gelernt, dass man tun nicht Warteschlange Objekte unter ARC freizugeben. Aber andere GCD-Objekte mögen eine Versandquelle?

+1

Die beanspruchte "doppelte Frage" ist nicht einmal knapp. Die Antworten sprechen speziell über GCD-Warteschlangen. Diese Frage fragt speziell, ob dies für andere GCD-Objekte zutrifft. – openfrog

+2

Versuchen Sie es. Der Compiler wird Sie nicht lassen, wenn es nicht notwendig ist (ist es nicht). –

+1

Nach meiner Erfahrung erwähnt die Apple-Dokumentation immer, dass Sie Releases verwalten müssen. Gewöhnlich gibt es bestimmte Funktionen, um die Freigabe durchzuführen. In diesem Fall scheint es beim Lesen der Dokumente von der Verwendung abhängig zu sein, ob Sie das Release selbst verwalten müssen. Ich nehme an, dass wenn Sie dispatch_retain verwenden und einen Zeiger halten, müssen Sie ihn selbst freigeben. Ich habe diese Funktion jedoch nicht benutzt, also nimm das mit einem Körnchen Salz. –

Antwort

7

Nein, vorausgesetzt, Ihr Bereitstellungsziel ist iOS 6.0 oder Mac OS X 10.8 oder höher, wie unter here erläutert.

Alle GCD-Objekte werden von ARC verwaltet, so dass Sie ihren Speicher nicht explizit verwalten müssen. Was für dispatch_queue_t gilt, gilt auch für alle anderen GCD-Objekte.

Dies ist in <os/object.h> direkt über der Definition von OS_OBJECT_HAVE_OBJC_SUPPORT dokumentiert.

Standardmäßig werden libSystem-Objekte wie GCD- und XPC-Objekte beim Erstellen mit einem Objective-C-Compiler als Objective-C-Typen deklariert. Dies ermöglicht ihnen die Teilnahme an ARC, an der RR-Verwaltung durch die Laufzeitumgebung Blocks und an der Überprüfung von Lecks durch den statischen Analysator und ermöglicht deren Hinzufügen zu Cocoa-Sammlungen.

Sie können dieses Verhalten auch mit dem Compiler-Flag -DOS_OBJECT_USE_OBJC=0 ablehnen.

1

Hier ist Compiler-Richtlinie zu Ihrem Code hinzufügen.

// 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 
Verwandte Themen