Non ci sono svantaggi. Usalo. Fallo oggi. È più veloce del tuo vecchio codice. È più sicuro del tuo vecchio codice. È più facile del tuo vecchio codice. Non è la raccolta dei rifiuti. Non ha overhead di runtime GC. Il compilatore inserisce conserva e rilascia in tutti i posti che dovresti avere comunque. Ma è più intelligente di te e può ottimizzare quelli che non sono effettivamente necessari (proprio come può srotolare loop, eliminare variabili temporanee, funzioni inline, ecc.)
OK, ora ti parlerò dei piccoli svantaggi:
Se sei uno sviluppatore ObjC di lunga data, ti contrarrai per circa una settimana quando vedrai il codice ARC. Lo supererai molto rapidamente.
Ci sono alcune (molto) piccole complicazioni nel collegamento al codice Core Foundation. Ci sono un po 'più complicazioni a che fare con tutto ciò che tratta un id
come void*
. Cose come C-array di id
possono richiedere un po 'più di riflessione per essere eseguite correttamente. Anche la manipolazione stravagante di ObjC va_args
può causare problemi. La maggior parte delle cose che coinvolgono la matematica su un puntatore ObjC è più complicata. Non dovresti avere molto di questo in ogni caso.
Non si può mettere un id
in un struct
. Questo è abbastanza raro, ma a volte viene utilizzato per impacchettare i dati.
Se non hai seguito la denominazione KVC corretta e mescoli codice ARC e non ARC, avrai problemi di memoria. ARC utilizza la denominazione KVC per prendere decisioni sulla gestione della memoria. Se è tutto codice ARC, non importa perché farà lo stesso "sbagliato" su entrambi i lati. Ma se è misto ARC / non-ARC, allora c'è una mancata corrispondenza.
ARC perderà memoria durante i lanci di eccezioni ObjC. Un'eccezione ObjC dovrebbe essere molto vicina in tempo alla conclusione del programma. Se stai rilevando un numero significativo di eccezioni ObjC, le stai utilizzando in modo errato. Questo è risolvibile utilizzando -fobjc-arc-exceptions
, ma incorre nelle sanzioni discusse di seguito:
ARC non perderà memoria durante le eccezioni ObjC o C ++ nel codice ObjC ++, ma ciò è a scapito delle prestazioni di tempo e spazio. Questo è ancora un altro in un lungo elenco di motivi per ridurre al minimo l'utilizzo di ObjC ++.
ARC non funzionerà affatto su iPhoneOS 3 o Mac OS X 10.5 o versioni precedenti. (Questo mi impedisce di utilizzare ARC in molti progetti.)
__weak
i puntatori non funzionano correttamente su iOS 4 o Mac OS X 10.6, il che è un peccato, ma abbastanza facile da aggirare. __weak
i puntatori sono ottimi, ma non sono il punto vendita numero 1 di ARC.
Per il 95% + del codice disponibile, ARC è eccezionale e non c'è alcun motivo per evitarlo (a condizione che tu possa gestire le restrizioni della versione del sistema operativo). Per il codice non ARC, è possibile passare -fno-objc-arc
file per file. Xcode purtroppo rende questo molto più difficile di quanto dovrebbe essere in pratica. Probabilmente dovresti spostare il codice non ARC in un xcodeproj separato per semplificarlo.
In conclusione, passa ad ARC il prima possibile e non guardarti mai indietro.
MODIFICARE
Ho visto un paio di commenti sulla falsariga di "l'utilizzo di ARC non è un sostituto per conoscere le regole di gestione della memoria Cocoa". Questo è per lo più vero, ma è importante capire perché e perché no. Innanzitutto, se tutto il codice utilizza ARC e si violano le tre parole magicheovunque, non avrai ancora problemi. Scioccante da dire, ma eccoti. ARC potrebbe conservare alcune cose che non volevi conservare, ma rilascerà anche quelle, quindi non avrà mai importanza. Se oggi insegnassi una nuova classe a Cocoa, probabilmente non spenderei più di cinque minuti sulle effettive regole di gestione della memoria, e probabilmente menzionerei solo le regole di denominazione per la gestione della memoria mentre discuto dei nomi KVC. Con ARC, credo che potresti diventare un programmatore principiante decente senza imparare affatto le regole di gestione della memoria.
Ma non potresti diventare un programmatore intermedio decente. È necessario conoscere le regole per creare un collegamento corretto con Core Foundation e ogni programmatore intermedio deve affrontare la CF ad un certo punto. Ed è necessario conoscere le regole per il codice misto ARC / MRC. E devi conoscere le regole quando inizi a scherzare con i void*
puntatori id
(a cui continui a essere necessario per eseguire correttamente KVO). E i blocchi ... beh, la gestione della memoria a blocchi è semplicemente strana.
Quindi il mio punto è che la gestione della memoria sottostante è ancora importante, ma dove passavo molto tempo a stabilire e riaffermare le regole per i nuovi programmatori, con ARC sta diventando un argomento più avanzato. Preferisco che i nuovi sviluppatori pensino in termini di grafi a oggetti piuttosto che riempirsi la testa con le chiamate sottostanti a objc_retain()
.