Disabilita il conteggio dei riferimenti automatico per alcuni file


183

Ho scaricato l'SDK di iOS 5 e ho scoperto che ARC è una grande funzionalità del nuovo compilatore Apple. Per il momento, molti framework di terze parti non supportano ARC. Posso usare ARC per il mio nuovo codice e mantenere invariato il codice di conservazione / rilascio corrente? Il convertitore ARC non funziona qui, poiché alcuni framework, come JSONKit, non possono essere convertiti in ARC utilizzando il convertitore.

Modificare:

La risposta è aggiungere -fno-objc-arcai flag del compilatore per i file che non si desidera ARC. In Xcode 4, puoi farlo sotto il tuo obiettivo -> Crea fasi -> Compila fonti.



2
Per chiarire, basta aggiungerlo al .mfile. Non il .hfile.
ma11hew28,

Ho trovato questa conversazione: github.com/gowalla/AFNetworking/issues/36 Forse aiuta qualcuno a integrare JSONKit in un progetto supportato da iOS5 ARC ;-) Ma al momento non l'ho provato ...

Questo metodo ha funzionato per me. Stavo aggiungendo AsyncUdpSocket per UDP Multicast al mio progetto e quei file [almeno la versione corrente] NON supportano ARC. Quindi ho usato il metodo sopra per aggiungere il flag del compilatore al file AsyncUdpSocket.m e posso ottenere che il codice funzioni bene con la mia applicazione.
Ashu Joshi

2
Funziona perfettamente! Specifiche: vai al tuo obiettivo e scegli Crea fasi, quindi Compila fonti. Se fai doppio clic sul file .m in questione, si aprirà una finestra in cui puoi digitare / incollare: "-fno-objc-arc"
mpemburn

Risposte:


73

I documenti ARC pubblici , sebbene non siano chiari direttamente su questo punto, sembrano suggerire che fintanto che ogni classe è tutta ARC o tutta gestita manualmente, le classi possono essere integrate in un singolo programma.

Non puoi mescolare ARC e non ARC in un'unica classe; il documento afferma che l'invio retain, release, autorelease, o retainCountmessaggi di qualsiasi mezzo (compresi i timer e si esibisce in ritardo, che l'uso @selector) è vietato nel codice ARC. Quindi non puoi fare un non-ARC in una classe ARC (perché i messaggi necessari sono vietati) e non puoi fare un ARC in una classe non-ARC (perché ARC aggiunge elementi di sintassi che non sono validi senza ARC).

Lo stesso documento è un po 'più chiaro se è possibile integrare librerie / framework non ARC in un programma ARC: Sì. Non menziona se è possibile utilizzare librerie / framework ARC in un programma in cui tutto il codice è non ARC, ma dato tutto quanto sopra, l'implicazione sembra essere sì.


Grazie! Ho capito come disabilitare ARC per le classi non ARC esistenti.
lucido

Potresti condividere con noi quello che stai facendo?
David H,

1
@David H: Se intendevi indirizzarlo all'interrogatore, dovresti notare che l'interrogatore ha modificato la soluzione nella domanda.
Peter Hosey,

La compilazione ARC non può essere disabilitata nei file HEADER. Clang NON compilerà l'interfaccia / intestazione in base alla compilazione del suo file di implementazione / metodo. Pertanto, i file di intestazione devono essere compatibili con ARC e non ARC in una compilation mista. Vedo questo come un bug nel compilatore.
carmin,

1
@carmin: non lo è. Il compilatore non esamina i file di intestazione tranne quando glielo dici, cosa che di solito fai solo #importinserendoli dai file del modulo. L'impostazione dei flag del compilatore è per ciascun file del modulo (più precisamente, ogni file nella fase di compilazione delle "fonti di compilazione"). Il compilatore non ha modo di sapere se dovrebbe usare ARC o meno per qualsiasi altro file, tranne ereditando la scelta che è stata data per il file del modulo con cui è iniziato.
Peter Hosey,

78

Non è molto intuitivo come disabilitare ARC su file MULTIPLI , per un po 'lo facevo uno per uno fino a capire come farlo.

  1. Seleziona i file desiderati su Target / Crea fasi / Compila fonti in Xcode (CMD + clic o Maiusc + clic)
  2. PREMERE INVIO (il doppio clic ripristina la selezione, quindi non funziona)
  3. Digitare -fno-objc-arc
  4. Premi Invio o Fine

1
Non è proprio una risposta alla domanda posta qui, ma comunque un buon consiglio! Votato +1
Kristof Van Landschoot il

Hai ragione, non lo è, ma ho sempre cercato su Google il passaggio e questa risposta è uno dei migliori successi. In questi giorni ho pensato che la maggior parte delle persone conoscesse già la risposta, ma non questo "suggerimento"
Tibidabo,

35

Se si desidera disabilitare il conteggio automatico dei riferimenti per alcuni file, è davvero semplice seguire i passaggi. È possibile aggiungere flag di compilatore in Target -> Fasi di costruzione -> Sorgenti di compilazione.

Xcode

La bandiera utilizzata è -fno-objc-arc premere invio dopo averlo scritto.! Devi fare doppio clic sulla colonna destra della riga sotto Flag del compilatore. Spero che ti aiuti Grazie :)


14
È possibile utilizzare lo stesso metodo per abilitare ARC su un file specifico in un progetto non ARC utilizzando il flag -fobjc-arc.
lnafziger,

La compilazione ARC non può essere disabilitata nei file HEADER. Clang NON compilerà l'interfaccia / intestazione in base alla compilazione del suo file di implementazione / metodo. Pertanto, i file di intestazione devono essere compatibili con ARC e non ARC in una compilation mista. Vedo questo come un bug nel compilatore.
carmin,

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.