Alcune domande sul conteggio automatico dei riferimenti nell'SDK di iOS5


134

Attualmente sto sviluppando un'app per iPad. Lo sviluppo è iniziato per iOS 4.2 e ora continua (e penso che sarà completato) per iOS 4.3. Ho appena letto di ARC su iOS 5 e in pratica ho capito che non avremo più bisogno di rilasciare e conservare oggetti. Le mie domande sono:

  1. Se decido di eseguire l'aggiornamento a iOS 5, devo rimuovere tutte le istruzioni [myObject retain]e il [myObject release]mio codice?

  2. Se sviluppo una nuova app per iOS 5 utilizzando ARC, dovrò implementare una sorta di controlli di "retrocompatibilità"? cioè: dovrò controllare la versione di iOS e chiamare trattenere e rilasciare di conseguenza? Quindi, fondamentalmente, ARC è disponibile per tutte le versioni di iOS o solo per iOS 5?

Risposte:


150

Se decido di eseguire l'aggiornamento a iOS 5, devo rimuovere tutte le istruzioni [myObject retain] e [myObject release] dal mio codice?

Sì, ma XCode 4.2 include un nuovo strumento "Migrate to Objective-C ARC" (nel menu Modifica-> Refactor), che lo fa per te. Chiamare dealloc è una storia diversa. Come menzionato nei commenti, il riferimento al clang afferma che dovresti mantenere il tuo metodo dealloc:

Motivazione: anche se ARC distrugge automaticamente le variabili di istanza, ci sono ancora motivi legittimi per scrivere un metodo dealloc, come liberare risorse non conservabili. Non riuscire a chiamare [super dealloc] in un tale metodo è quasi sempre un bug.

Si abilita ARC usando un nuovo flag di compilatore -fobjc-arc. ARC è supportato in Xcode 4.2 per Mac OS X v10.6 e v10.7 (applicazioni a 64 bit) e per iOS 4 e iOS 5. (I riferimenti deboli non sono supportati in Mac OS X v10.6 e iOS 4). Non c'è supporto ARC in Xcode 4.1.

-

Se sviluppo una nuova app per iOS 5 utilizzando ARC, dovrò implementare una sorta di controlli di "retrocompatibilità"? Vale a dire: dovrò controllare la versione di iOS e chiamare trattenere e rilasciare di conseguenza? Quindi, fondamentalmente, ARC è disponibile per tutte le versioni di iOS o solo per iOS 5?

No, perché ARC fa la sua magia in fase di compilazione e non in fase di esecuzione.

Invece di dover ricordare quando utilizzare la conservazione, il rilascio e il rilascio automatico, ARC valuta i requisiti di durata dei tuoi oggetti e inserisce automaticamente le chiamate del metodo appropriato al momento della compilazione. Il compilatore genera anche metodi dealloc appropriati per te.

Ulteriori informazioni su ARC: http://clang.llvm.org/docs/AutomaticReferenceCounting.html


Grazie per la tua spiegazione!
Luca

4
Questo non è corretto al 100%. C'è uno switch del compilatore che determina se ARC è abilitato o meno. Anche ARC ha bisogno di supporto per il runtime, credo, quindi se vuoi che la tua app funzioni su iOS 4.x dovrai lasciare le tue conservazioni e le tue versioni e assicurarti che ARC sia spento.
JeremyP,

8
@JeremyP - iOS 4.0 è infatti supportato come destinazione per le applicazioni ARC, quindi non è necessario mantenere il codice conteggio di riferimento manuale per indirizzare quella piattaforma più vecchia. iPhone OS 3.x forse, ma immagino che Apple potrebbe interrompere il supporto come piattaforma di destinazione una volta che 5.0 è stato spedito, come hanno fatto per 2.x quando è uscito 4.0.
Brad Larson

5
@Brad La base di installazione per iOS4 è già superiore al 95%. Penso che sia salva la caduta del supporto iOS3 comunque.
Henrik P. Hessel,

2
Non rimuovi dealloc, rimuovi solo tutte le tue releasee [super dealloc]da esso. E nel 99,9% deallocrilascia solo oggetti, quindi lo rimuovi. Ma gli oggetti devono ancora eseguire altre attività di pulizia che non lo sono release(chiusura di file, rimozione di osservatori, ecc.).
Stanislav Yaglo,

8

Q1: NO, se hai un codice esistente, puoi continuare ad usarlo così come è con -fno-objc-arc è possibile disabilitare in modo selettivo ARC su qualsiasi file.

Se si desidera disabilitare ARC su file MULTIPLI :

  1. Seleziona i file desiderati su Target / Crea fasi / Compila fonti in Xcode
  2. PREMERE INVIO . (doppio clic seleziona un solo file)
  3. Digitare -fno-objc-arc
  4. Premi Invio o Fine

Q2: NO, il target può essere basso quanto iOS 4.0


7

Per quanto ho capito e per quanto riguarda il mio iPhone / iPod con iOS 5 e iOS 4.3 rispettivamente, è tutto abbastanza automatico. Un'app che ho avviato per 4.0 e che ho "aggiornato" per funzionare con Xcode per iOS 5.0 non genera mai alcun tipo di avviso per rilasciare e conservare, anche se è presente in ogni dealloc, ecc. Tuttavia, parte dello stesso codice che ho inserito (copiato il file) in un nuovo progetto creato con Xcode per iOS 5 ha molti, molti avvisi. Quindi sembra che non sia necessario rimuovere tutte quelle chiamate, e no, in qualche modo si adatta automaticamente alle versioni precedenti. Profilando il mio iPod, non vedo perdite di memoria o altri segni di fallimenti o rilasci. questo aiuta?


L'ultima versione beta mi chiede di rimuovere tutte le chiamate di allocazione, e questo è tutto. Puoi ancora conservare / rilasciare ma il sistema ha l'ultima parola.
Dylan Gattey,

5

Riguardo a questa parte della tua domanda

Se sviluppo una nuova app per iOS 5 utilizzando ARC, dovrò implementare una sorta di controlli di "retrocompatibilità"? Vale a dire: dovrò controllare la versione di iOS e chiamare trattenere e rilasciare di conseguenza? Quindi, fondamentalmente, ARC è disponibile per tutte le versioni di iOS o solo per iOS 5?

Va notato che il compilatore iOS 5 utilizza la "retrocompatibilità" (in realtà ADDS il codice per far funzionare la funzione di conservazione / rilascio), ma se non si sta compilando per iOS 5.0, non è possibile utilizzare weakcome parola chiave . Invece tu usi assign. Questo è un peccato: weakè un enorme vantaggio (nessun puntatore penzolante, mai!). Vedi la mia domanda qui per una discussione di weak, assigne ARC.


2

Se puoi disabilitare ARC non usando il nuovo flag del compilatore -fobjc-arc, allora non sei obbligato a riscrivere il codice andando avanti - suppongo (?)

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.