2013-05-11 17 views
6

Perché ARC non può utilizzare una versione normale?Perché si autorelease ARC quando si utilizzano riferimenti deboli?

Esempio:

[weakObject doSomething]; 

Da quello che ho capito, ARC trasforma questo in:

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

Perché non ARC fare questo, invece ?:

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

mi piacerebbe piace eliminare tutti i possibili autoreleases in ARC. Faccio un sacco di async filettatura con GCD e finisco dover aggiungere piscine autorelease un sacco:

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

Mancanza di un compilatore sufficientemente intelligente, in pratica. Potrebbe valere un bug report, anche se è probabile che sia stato archiviato ed è sicuramente noto. –

+0

Da dove viene visualizzato weakObject? –

risposta

2

non riesco a spiegare il motivo per cui il compilatore ARC lo fa in questo modo, ma se ho ben capito il codice assembly generato correttamente , utilizzando il seguente modello

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

è tradotto in objc_loadWeakRetained() ..., objc_release(), in modo che l'oggetto non viene messo in una piscina autorelease.

Problemi correlati