2012-01-05 3 views
7

Ho sviluppato un'applicazione per iPhone che dovrebbe supportare iPhone/iPad basati su iOS4 e iOS5.ARC o non ARC iphone iOS5

la mia applicazione perde memoria in alcuni punti che diventa difficile eseguire il debug a causa della dimensione del codice. Recentemente ho letto di ARC (Automatic Reference Counting), la mia domanda è

  1. ho bisogno di modificare il mio codice sorgente (mantenere/release/alloc/dealloc) per compilare con ARC. anche quali sono tutti i cambiamenti che dobbiamo eseguire usando ARC?

  2. è consigliabile passare a ARC?

  3. sarà il mio lavoro app sul telefono iOS4 se uso ARC

grazie.

+0

Suggerisco di fare questa domanda una voce wiki ... è sicuramente una buona domanda e sicuramente correlata alla programmazione, ma la maggior parte della domanda è davvero un'opinione e legata a circostanze specifiche. –

+1

Stai facendo tre domande diverse qui. Il secondo è coperto da [iOS 5 Best Practice (Release/retain?)] (Http://stackoverflow.com/questions/6308425/ios-5-best-practice-release-retain), e il terzo da [se convertito progetto su Automatic Reference Counting (ARC), è ancora supportato su iOS 3.X, 4.X?] (http://stackoverflow.com/questions/6421753/if-convert-project-to-automatic-reference-countingarc -is-it-still-support-on) –

risposta

14

Probabilmente questo non è il posto migliore per avere postato questa domanda, ma risponderò perché non mi dispiace che la domanda sia qui.

http://developer.apple.com/library/mac/#releasenotes/ObjectiveC/RN-TransitioningToARC/_index.html

  1. si utilizzerà la 'Modifica> Refactor> Converti in Objective-C ARC' strumento di migrazione e la mano risolvere nulla lo strumento non riesce a capire.

  2. Sì.

  3. Sì, ma l'azzeramento dei riferimenti deboli non lo farà.

+0

Un'altra considerazione è che molte librerie di terze parti non hanno ancora una buona versione di Arc. Questo mi impedisce di aggiornare alcuni dei miei progetti esistenti. –

+2

È possibile escludere selettivamente qualsiasi file di origine da ARC quando si esegue la conversione. Basta deselezionare tutti i file di classe di terze parti nella fase di verifica preliminare dello strumento di conversione ARC e salterà e li contrassegnerà con -fno-objc-arc in modo che vengano esclusi dalla convalida ARC. Questa è una delle migliori caratteristiche di ARC: è possibile combinare file ARC e non ARC nello stesso progetto. –

4

Sono assolutamente convinta che è bene per i programmatori di comprendere la gestione della memoria e come il sistema funziona realmente ... ma, penso ARC è un sistema molto buono e funziona davvero bene. Questa è davvero una domanda di opinione, quindi la mia opinione è che vale quasi sempre la pena di iniziare nuovi progetti che indirizzeranno applicazioni iOS 5 su ARC, tranne in circostanze molto specifiche.

Sento che se stai usando un sacco di librerie C nel tuo codice, ARC è un po 'più difficile da usare in questo momento (quindi se usi principalmente librerie C di terze parti e cose come CoreFoundation, potrebbe considerare se abbia senso o meno), ma anche allora, se queste librerie sono per lo più isolate dai tuoi controller Objective-C e simili, ARC è comunque buono.

Per le app precedenti, è necessario esaminare l'utilizzo e i modelli dell'app. Se usi molti metodi delegati, dato che non puoi usare riferimenti deboli su iOS 4, diventa un po 'più complicato e probabilmente dovrai disporre di un codice misto ARC e non ARC. Potrebbe essere meglio prendere una decisione progettuale per andare avanti con ARC. Quindi le nuove funzionalità sono progettate per iOS 5 e forse non disponibili (o completamente disponibili) nella versione iOS 4 dell'app e quelle che utilizzano ARC.

In realtà, in definitiva, dipenderà dal modo in cui la vostra applicazione è già stata progettata, quanto è grande e quanto siete comodi con la gestione della memoria gestita e l'uso/le restrizioni di ARC. Ad esempio, ho tre progetti che non convertirò mai in ARC, uno che sto mixando in questo momento, uno che è completamente convertito (ma che ha ancora come target iOS 4+) e 2 che sono full-on ARC e iOS 5+ solo.

+0

OpenGL è tecnicamente un'API C, anche se senza alcun tipo di conservazione diretta degli oggetti, quindi non c'è bisogno di "bridge"; Tutti gli oggetti sono interni e opachi e sono accessibili tramite funzioni e ID interi. Tuttavia, c'è qualcosa di cui essere a conoscenza quando si utilizza OpenGL all'interno del codice ARC Obj-C? –

1

Per essere chiari, mentre non è possibile utilizzare ARC riferimenti deboli se ci si rivolge iOS 4, è possibile ancora usare unsafe_unretained, che è fondamentalmente l'equivalente di utilizzare assign per le proprietà degli oggetti. Ciò significa che è possibile convertire qualsiasi codice ARC non scritto in modo intelligente senza creazione accidentale di cicli di conservazione su iOS 4.

Utilizzando unsafe_unretained si perde la funzione di null automatico di riferimenti deboli, ma si ottiene comunque tutti gli altri vantaggi di ARC come non doversi preoccupare di dimenticare di rilasciare ivars nelle dichiarazioni dealloc, ecc.