Quali sono i vantaggi e gli svantaggi dell'utilizzo del nuovo stile di gestione della memoria di conteggio dei riferimenti automatici (ARC) in un progetto iOS?
L'esecuzione di un programma ARC è quasi identica alla MRC ben scritta. Cioè, le differenze comportamentali sono spesso inosservabili perché entrambi gli ordini e le prestazioni sono molto vicini.
Se sai già come implementare le app OS X o iOS con il conteggio dei riferimenti manuali (MRC), ARC non aggiunge realmente funzionalità, ma ti consente solo di rimuovere le operazioni di conteggio dei riferimenti dalle tue fonti.
Se non si desidera imparare MRC, si consiglia di provare prima ARC. Un sacco di persone lottano o tentano di ignorare le pratiche comuni di MRC (esempio: ho introdotto un numero di strumenti objc per l'analizzatore statico). Se vuoi evitare questi problemi, ARC ti permetterà di posticipare la tua comprensione; non è possibile scrivere programmi objc non banali senza comprendere il conteggio dei riferimenti e le durate e le relazioni tra oggetti, quali MRC, ARC o GC. ARC e GC rimuovono semplicemente l'implementazione dalle tue fonti e fanno la cosa giusta nella maggior parte dei casi. Con ARC e GC, dovrai comunque dare una guida.
Non ho rilevato questo, ma potrebbe essere opportuno ricordare che lo che compila le origini ARC richiederebbe più tempo e risorse.
Se il programma che si sta sviluppando è l'utilizzo piuttosto libera del conteggio dei riferimenti (per esempio una quantità tipica di autoreleases), il passaggio ad arco potrebbe davvero migliorare i tempi di esecuzione del programma e l'utilizzo della memoria di picco.
È possibile scegliere di non utilizzare ARC durante lo sviluppo con l'SDK di iOS 5.0?
Sì, utilizzando CLANG_ENABLE_OBJC_ARC. ARC è compatibile con i binari e tutto ciò che accade realmente è che il compilatore fa del proprio meglio per introdurre automaticamente le operazioni di conteggio di riferimento appropriate, in base alle dichiarazioni visibili alla traduzione corrente (see my answer here as to why translation visibility is important). Pertanto, è anche possibile abilitarlo e disabilitarlo per alcune fonti in un progetto e abilitarlo per gli altri.
La modalità mista (alcuni MRC e alcune sorgenti ARC) è tuttavia abbastanza complicata, e in modo sottile, in particolare le implementazioni di wrt che possono essere duplicate dal compilatore (ad esempio il corpo di una funzione inline potrebbe non essere corretto). Tali problemi in modalità mista saranno molto difficili da isolare. I programmi e le fonti di ObjC++ saranno in particolare difficili da questo punto di vista. Inoltre, il comportamento può variare in base alle impostazioni di ottimizzazione (come un esempio); un programma che funziona perfettamente in una build di debug può introdurre una perdita o uno zombie nel rilascio.
Si consiglia l'ARC o il conteggio del riferimento manuale (MRC) per un nuovo progetto?
Personalmente, rimarrò con MRC per qualche tempo. Anche se ARC è stato testato nell'uso del mondo reale, è probabile che ci siano ancora un numero di problemi che si presentano in scenari complessi, che vorrete evitare di essere i primi a conoscere e fare il debug. La Garbage Collection di OS X è un esempio del perché potresti voler aspettare. Ad esempio, lo switch potrebbe cambiare quando gli oggetti vengono distrutti: gli oggetti potrebbero essere distrutti prima e mai collocati nei pool di autorelease. Potrebbe anche cambiare l'ordine in cui vengono rilasciati gli ivar, che potrebbero avere alcuni effetti collaterali.
Ho anche una grande base di codice che non voglio perdere una settimana testando questa funzione per ora. Infine, la compatibilità all'indietro è ancora importante per me.
Un'applicazione che utilizza ARC può essere eseguita su versioni del sistema operativo precedenti rispetto a iOS 5.0?
Se sviluppi con MRC, sarà retrocompatibile. Se sviluppi con ARC, non sarà necessariamente compatibile. In effetti, potrebbe non essere nemmeno compilato senza un piccolo lavoro extra. I requisiti per il runtime sono disponibili in alcune versioni precedenti. See also this question. Se hai bisogno di compatibilità con le versioni precedenti, ARC non sarà un'opzione per alcune versioni del sistema operativo.
Infine, se si dovesse limitare la scelta a GC o ARC, raccomanderei ARC.
Sono disponibili diverse domande qui, due dei quali vengono affrontati nelle domande [Come funziona il nuovo meccanismo di conteggio automatica del riferimento?] (Http://stackoverflow.com/questions/6385212/how-does-the-new- automatico-di conteggio dei riferimenti meccanismo-lavoro) e [Xcode 4.2 con ARC: sarà il mio codice eseguito anche sui dispositivi iOS con firmware precedente alla 5.0?] (http://stackoverflow.com/questions/7768861/xcode-4-2 -con-arc-will-my-codice-run-anche-on-IO-dispositivi-con-firmware-vecchio-tha) –