2013-05-11 15 views
6

Dlaczego ARC nie może używać zwykłego wydania?Dlaczego ARC autorelease podczas używania słabych odniesień?

Przykład:

[weakObject doSomething]; 

Z tego co rozumiem, to się okazuje ARC:

Object *strongObject = objc_autorelease(objc_loadWeakRetained(weakObject)); 
[strongObject doSomething]; 

Dlaczego nie ARC zamiast to zrobić ?:

Object *strongObject = objc_loadWeakRetained(weakObject); 
[strongObject doSomething]; 
objc_release(strongObject); 

ja jak pozbyć się jak największej ilości autoreleaseów w ARC. Robię dużo asynchronicznym gwintowania z GCD i skończę konieczności dodawania Pools autorelease dużo:

dispatch_async(self.myQueue, ^{ 
    @autoreleasepool{ 
     [weakObject doSomethingBig]; 
    } 
}); 
+1

Brak odpowiednio inteligentnego kompilatora. Może być wart raportu błędu, choć prawdopodobnie został złożony i jest zdecydowanie znany. –

+0

Skąd bierze się obiekt weakObject? –

Odpowiedz

2

Nie potrafię wyjaśnić, dlaczego kompilator ARC robi to w ten sposób, ale gdybym prawidłowo zrozumieć wygenerowany kod montaż , stosując następujący wzór

dispatch_async(self.myQueue, ^{ 
    Object *strongObject = weakObject; 
    [strongObject doSomething]; 
}); 

przekłada się objc_loadWeakRetained() ..., objc_release(), tak aby obiekt nie jest oddany do puli autorelease.

Powiązane problemy