(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?
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
Versuchen Sie es. Der Compiler wird Sie nicht lassen, wenn es nicht notwendig ist (ist es nicht). –
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. –