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.