Mam trudności z konwersją kodu NSOperation na ARC. Mój obiekt operacji używa bloku zakończenia, który z kolei zawiera blok GCD, który aktualizuje interfejs użytkownika w głównym wątku. Ponieważ odwołuję się do obiektu operacji z wewnątrz własnego bloku zakończenia, używam wskaźnika __weak, aby uniknąć wycieku pamięci. Jednak wskaźnik jest już ustawiony na zero do czasu uruchomienia mojego kodu.Odwoływanie się do obiektu NSOperation w jego własnym bloku ukończenia z ARC
Zawęziłem to do tej próbki kodu. Czy ktoś wie, gdzie popełniłem błąd i jak to zrobić?
NSOperationSubclass *operation = [[NSOperationSubclass alloc] init];
__weak NSOperationSubclass *weakOperation = operation;
[operation setCompletionBlock:^{
dispatch_async(dispatch_get_main_queue(), ^{
// fails the check
NSAssert(weakOperation != nil, @"pointer is nil");
...
});
}];
Cóż, chodzi o to, że słaby wskaźnik nie jest właścicielem. Jeśli nie ma nic innego, co trzymałoby zmienną (a jej nie ma), zostanie oczyszczone. Czy jesteś pewien, że dostaniesz wyciek, jeśli użyjesz 'operation'? Wygląda na to, że powinien zniknąć, gdy zostanie ukończony blok ukończenia, który powinien nastąpić, gdy tylko zostanie wywołany. (To może być naiwne.) –
ARC skarżyło się na to podczas kompilacji. Bez tego używałbym bezpośrednio wskaźnika operacji (i nie wierzę, że przeciekałem pamięć). –
Powodzenia z tym. Myślę, że walczyłem z tym przez kilka godzin, zanim poddałem się i zrobiłem coś innego. Ale minęło trochę czasu. :) –