Best practice per iOS 5 (rilasciare / conservare?)


109

In qualità di programmatore iPhone principiante, qual è la migliore pratica per scrivere app da utilizzare con iOS 5 o versioni precedenti? In particolare, dovrei continuare a utilizzare il rilascio / conservazione dei dati o dovrei ignorarlo? Importa?


1
Usa ARC e segui le migliori pratiche descritte qui: amattn.com/2011/12/07/arc_best_practices.html Se lo fai, scoprirai che ARC "funziona". Se non segui queste pratiche, ti ritroverai con perdite e passerai molto tempo a rintracciarle ...
n13

Risposte:


98

Tocca a voi. Puoi scrivere app utilizzando ARC (Automatic Reference Counting) e Xcode scriverà "codice collante" per consentire alle tue app abilitate ARC di funzionare su iOS 4, senza modifiche. Tuttavia, alcune cose non funzioneranno e, in particolare, molte librerie che potresti voler utilizzare (a volte) genereranno innumerevoli errori e non sarai in grado di usarle fino a quando gli sviluppatori non rilasceranno un aggiornamento compatibile con ARC.


Modifica : ho scoperto di recente che puoi disattivare ARC su base file. Vedi la risposta di pixelfreak . Quindi, il mio consiglio è ancora valido, ma ora le librerie di terze parti non dovrebbero aver bisogno di essere aggiornate per funzionare con ARC.

Ecco cosa dice Apple sulla disattivazione di ARC per file specifici:

Quando si migra un progetto per utilizzare ARC, il flag del compilatore -fobjc-arc è impostato come predefinito per tutti i file sorgente Objective-C. Puoi disabilitare ARC per una classe specifica usando il flag del compilatore -fno-objc-arc per quella classe. In Xcode, nella scheda Build Phases di destinazione, aprire il gruppo Compile Sources per visualizzare l'elenco dei file di origine. Fare doppio clic sul file per il quale si desidera impostare il flag, immettere -fno-objc-arc nel pannello a comparsa, quindi fare clic su Fine.

inserisci qui la descrizione dell'immagine

Vedi la guida completa alla transizione qui .


15
L'ARC può evidentemente essere disattivato "per file", forse consentendo l'uso di librerie legacy ... Ma non ci ho giocato quindi non lo so ancora. Però ne sono piuttosto eccitato. Riesci a immaginare un mondo in cui gli sviluppatori iOS non devono sudare per trattenere / rilasciare ?? Di cosa parleremo qui a SO ?? ;-)
Dan Ray

45
Proprio quando finalmente ho avuto un buon controllo su tutta quella merda di gestione della memoria, e poi lo rendono irrilevante. LAVORI!!!
Kongress

@ Dan: non stai scherzando può essere disattivato selettivamente? Si prega di fornire un collegamento, che è importante per me! : D
sudo rm -rf

1
Credo che il compilatore non sia sotto NDA ora, quindi per escludere selettivamente alcuni file (in genere cartelle di origine di terze parti) dal tuo codice, aggiungi semplicemente questo come opzione del compilatore a ciascun file: -fno-objc-arc
blackjack75

2
@Yar: Sì, lo sei. Vorrei che fosse così semplice, ma sfortunatamente non tutte le librerie sono così semplici. Prendi JSONKit, per esempio. Prova a eseguirlo attraverso il controllo ARC. Vedrai cosa intendo. ;)
sudo rm -rf

170

Per chiunque sia ancora curioso di sapere come disattivare ARC su singoli file, ecco cosa ho fatto:

  1. Vai alle impostazioni del tuo progetto, sotto Build Phases > Compile Sources
  2. Seleziona i file che vuoi che ARC disabiliti e aggiungi i flag del compilatore -fno-objc-arc . È possibile impostare flag per più file in un colpo solo selezionando i file e premendo il tasto "Invio".

Non so se questo sia il modo consigliato, ma per me funziona.

PS: Ho raccolto queste informazioni da clang.llvm.org qui che è pubblicamente accessibile, quindi non sotto NDA.


1
Quando uso questo flag con una libreria funziona, ma non appena includo il file lib .h in una classe ARC Xcode si lamenta come se non avessi il flag lì. Sei riuscito a far funzionare le librerie più vecchie con questo flag?
Casey

Sono in grado di far funzionare ASIHttpRequest e SBJson (ricevo 1 avviso sull'utilizzo della struttura in Reachability.h). Ho messo la bandiera in tutti i loro file di implementazione.
pixelfreak

Tutti i file di implementazione o solo i file .h? Nella mia sezione Compile Sources del progetto ha solo i file di intestazione, nessun file di implementazione. Posso aggiungerli, ma non sembra avere un effetto diverso. Per tuo riferimento, sto cercando di far funzionare un parser REST. ( github.com/mirek/NSMutableDictionary-REST.framework )
casey

1
Aha! Non ho esaminato abbastanza da vicino gli errori. Sono errori diversi da quelli senza la bandiera. Ho solo dovuto rimuovere il pool di rilascio automatico dal codice e wha-la!
casey

Quando seleziono più file e premo Invio, come suggerito qui, sono stati tutti rimossi dalle "Sorgenti di compilazione" nelle fasi di compilazione. Ho dovuto selezionarli individualmente. Non sono sicuro di fare qualcosa di sbagliato.
Gopalakrishnan Subramanian

10

iOS 5 è ancora sotto un NDA, e probabilmente lo sarà fino a quando non rilasceranno la versione pubblica. Se hai un account sviluppatore, vai ai forum degli sviluppatori Apple e chiedi lì.

Per le versioni precedenti, è necessario contare i riferimenti e conservare e rilasciare di conseguenza. Consulta la guida alla gestione della memoria .

Modifica: ecco una specifica pubblica per il conteggio automatico dei riferimenti e una citazione dalla pagina pubblica di iOS 5 :

Il conteggio automatico dei riferimenti (ARC) per Objective-C rende la gestione della memoria il lavoro del compilatore. Abilitando ARC con il nuovo compilatore LLVM di Apple, non sarà mai più necessario digitare ritenzione o rilascio, semplificando notevolmente il processo di sviluppo, riducendo al contempo arresti anomali e perdite di memoria. Il compilatore ha una comprensione completa dei tuoi oggetti e rilascia ogni oggetto nell'istante in cui non viene più utilizzato, quindi le app vengono eseguite più velocemente che mai, con prestazioni prevedibili e fluide.


Le applicazioni sviluppate utilizzando iOS 5 funzioneranno con i vecchi iPhone?
Geekgirl

Sarai in grado di utilizzare gli strumenti per sviluppare per sistemi operativi meno recenti, ma non sarai in grado di utilizzare le nuove tecnologie come ARC. Se desideri scegliere come target i sistemi operativi meno recenti, dovrai eseguire la gestione manuale della memoria. Se vuoi usare ARC dovrai limitare gli utenti a iOS 5.
nevan king

1
Un riferimento ad ARC si trova su una pagina pubblica di Apple developer.apple.com/technologies/ios5, quindi almeno alcune parti di esso non sono sotto NDA.
acciottolato

8
In realtà non è del tutto vero. Puoi creare per iOS 4 con ARC. Citazione dell'ingegnere Apple: " Per iOS 4 e Mac OS 10.6, il compilatore aggiunge un po 'di codice collante di compatibilità runtime alla tua app. Funziona per tutto tranne __ variabili deboli, che richiedono più supporto di quanto possa fornire il codice di compatibilità. ARC su iOS 4 è più semplice del codice non ARC, ma non è semplice come ARC su iOS 5. "A proposito, l'app di pianificazione WWDC è stata scritta con ARC e ha funzionato perfettamente su iOS 4!
sudo rm -rf

3
Sì; tuttavia questo è stato qualificato al discorso ARC in quanto solo i target 4.3.x ottengono la "colla di compatibilità".
Alan Zeino

4

I dettagli sono chiari / sotto NDA al momento, ma Apple ha implementato il conteggio automatico dei riferimenti (ARC) in iOS 5, come dettagliato qui: http://developer.apple.com/technologies/ios5/

Se sviluppi una nuova app in Xcode 4 con iOS 5 SDK, puoi tranquillamente ignorare il conteggio dei ritiri / rilasci.

[modifica] sudo rm -rf è un buon punto; librerie di terze parti possono essere influenzate in modo significativo


Le applicazioni sviluppate utilizzando iOS 5 funzioneranno con i vecchi iPhone?
Geekgirl

Funzionerà su iPhone con iOS 5, quindi solo iPhone 3GS o iPhone 4. Non credo che supporterà iOS 4, ma poi di nuovo, è fatto da LLVM durante la compilazione, quindi potrebbe essere possibile produrre un binario per iOS 4 e 5. Consiglio vivamente di ottenere un account sviluppatore iOS e di giocare con le opzioni disponibili.
Dominic

Come sottolinea sudo nel suo commento sulla risposta di nevan, puoi effettivamente tornare a iOS 4.0 con ARC, quindi i dispositivi più vecchi che possono eseguire quel sistema operativo sono compatibili con questo.
Brad Larson

3

Nessuno ha menzionato SystemConfiguration.framework ? Per favore, non dimenticare di inserirlo in Frameworks . Ho trascorso miseramente diverse ore per rendermene conto.


dovresti spiegare perché.
John Riselvato

3

Certamente è la scelta dello sviluppatore o del team. ARC (Automatic Reference Counter) ha reso le cose un po 'più semplici gestendo automaticamente la memoria per te. Rilascerà, conserverà e rilascerà quando appropriato. Credo che dovresti acquisire esperienza nella gestione della memoria preferibilmente in un'applicazione di prova, se non l'hai già fatto. Un'altra cosa da considerare è se la tua applicazione si basa su librerie di terze parti, che se non convertite in ARC impediranno la compilazione della tua applicazione. La scelta dipende ovviamente dalla situazione a portata di mano.


0

imposta il flag come -fno-objc-arc nelle impostazioni del progetto> Build Phases> Compile Sources

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.