2011-10-15 20 views
13

Ho appena aggiornato un progetto per utilizzare ARC con lo strumento di conversione integrato Xcode 4.2. Sfortunatamente c'è un bug strano che non capisco e non ho trovato nulla. Ho una classe documento con una dichiarazione di proprietà:ARC e proprietà IBOutlet deboli

@property (weak) IBOutlet WebView *webView; 

Nel file di implementazione Ho un comunicato @synthesize:

@synthesize webView=_webView; 

Quando provo a compilarlo, non riesce e mi dice:

error: @synthesize of 'weak' property is only allowed in ARC or GC mode

Ovviamente il progetto viene taggato per compilare con ARC. Apprezzerei molto qualsiasi aiuto per capire cosa sto facendo male e perché.

Modifica: Era in ritardo ieri. Così qui è una più completa compilazione del registro:

[...] -fobjc-arc -Wno-trigraphs -fpascal-strings -O0 -Wmissing-prototypes -Wreturn-type -Wparentheses -Wswitch -Wno-unused-parameter -Wunused-variable -Wunused-value -Wshorten-64-to-32 -DDEBUG=1 -isysroot /Developer/SDKs/MacOSX10.7.sdk -fasm-blocks -mmacosx-version-min=10.7 -gdwarf-2 -Wno-sign-conversion "-DIBOutlet=attribute((iboutlet))" "-DIBOutletCollection(ClassName)=attribute((iboutletcollection(ClassName)))" "-DIBAction=void)attribute((ibaction)" -iquote [...]/Build/Intermediates/[...].build/Debug/[...].build/[...]-generated-files.hmap -I[...]/Build/Intermediates/[...].build/Debug/[...].build/[...]-own-target-headers.hmap -I[...]/Build/Intermediates/[...].build/Debug/[...].build/[...]-all-target-headers.hmap -iquote [...]/Build/Intermediates/[...].build/Debug/[...].build/[...]-project-headers.hmap -I[...]/Build/Products/Debug/include -I[...]/Build/Intermediates/[...].build/Debug/[...].build/DerivedSources/x86_64 -I[...]/Build/Intermediates/[...].build/Debug/[...].build/DerivedSources -F[...]/Build/Products/Debug -fno-objc-arc [...]

Sembra il compilatore-impostazioni per ARC sono attivate all'inizio e spento più tardi nella lista argomenti. Per essere onesti: non so dove rimuovere le impostazioni così strane e come si è arrivati ​​a questo. L'unica soluzione che avrei trovato ora sarebbe iniziare il progetto completo da uno vuoto e uno nuovo e importare tutti i file di classe da zero.

Se qualcuno conosce un modo più semplice, apprezzerei molto.

PS: Ho tutte le impostazioni di costruzione relative all'ARC impostato su SÌ.

+1

Cosa succede quando si rimuove il (debole)? – Phlibbo

+2

Controlla le impostazioni di compilazione. Fai clic sul tuo progetto nel navigatore di file, seleziona la scheda "Impostazioni di costruzione" e cerca "Conteggio di riferimento automatico". Quindi, assicurarsi che il campo per "Conteggio riferimenti automatico Objective C++" sia impostato su Sì. –

+0

@Philibbo: Se rimuovo il debole e lo sostituisco con un assegnamento, tutto viene compilato. È giusto, quando presumo che questo file sembra essere escluso dall'ARC in qualche modo? – Jacque

risposta

1

Ho impiegato un po 'più di tempo oggi e ho fatto una nuova conversione da un precedente commit del progetto. Questa volta è andato tutto bene. Presumo che questo errore sia emerso da me cercando di eseguire la conversione in 2 passaggi separati. Il progetto è diviso in 2 componenti. Volevo convertirli separatamente. Ecco perché non ho selezionato tutti i file durante la prima esecuzione di conversione. Con mio grande stupore, la prima conversione è avvenuta in modo molto semplice e in tempi più brevi di quanto mi aspettassi. Così ho deciso di convertire anche il secondo componente del progetto. Quello che ho trovato, era lo stato del progetto descritto come il problema sopra: impostazioni di configurazione conflittuali.

Un buon consiglio potrebbe essere non provare a convertire un progetto in passaggi, ma impiegare un altro paio di tempo e farlo in una volta. Devo supporre che la funzione di conversione di Xcode non possa essere intesa per tale procedura.

+2

Questo è stato un gioco da ragazzi davvero. Se si converte in passaggi, sarà necessario impostare il flag -fno-objc-arc sui file che sono stati esclusi dal passaggio di conversione iniziale. Il compilatore si è lamentato del fatto che i file che non erano ancora compatibili con ARC non erano contrassegnati come tali. Questo post lo copre abbastanza bene >> http://longweekendmobile.com/2011/09/07/objc-automatic-reference-counting-in-xcode-explained/ – pchap10k

6

FYI: Per chiunque altro afflitto dal "@synthesize di 'debole' immobile è consentito solo in ARC o in modalità GC" Errore:

Se hai provato tutte le soluzioni proposte in questa discussione e ancora non costruirà, prova a chiudere il progetto Xcode (File> Chiudi progetto), quindi riaprire il progetto e riprovare a costruire.

0

Nel caso in cui nessun altro inciampa oltre questo:

Ho appena risolto questo problema impostando "Objective-C Garbage Collection" a "non supportata" in impostazioni di generazione. Questo è stato impostato su SÌ per qualche motivo e questo ha causato il mancato funzionamento della build ARC.

2

Per gli altri utenti in questo caso, se il progetto è stato convertito in parti in ARC, verificare di non avere il flag -no-obj-arc sui file di cui si lamenta.

0

Ok, nel caso in cui qualcun altro abbia lo stesso problema di me, aggiungevo gli elementi dell'interfaccia utente come proprietà al di sotto della chiusura "}" del mio @interface, anziché all'interno. Dopo aver eliminato le voci @property e @synthesize nei file .h/.m e ricollegato gli elementi dell'interfaccia utente all'interno della sezione @interface {}, ha funzionato.

1

marcatura in modo esplicito con -fobjc ad arco come flag di compilazione nelle fasi di creazione

11

In un solo ARC dobbiamo usare weak proprietà e in senza ARC dobbiamo usare unsafe_unretained provarlo è stessi mezzi per ARC dobbiamo utilizzare

@property (weak) IBOutlet WebView *webView; 

e perché senza di ARC

@property(unsafe_unretained) IBoulet WebView *webView; 
0

Nel mio caso ho scoperto che modificando la configurazione Regolazione "compilatore per C/C++/Objective-C "nella categoria 'Build Options' al valore predefinito (" Apple LLVM compilatore 3.0 ") ha risolto questo problema.

Era stato impostato su "LLVM GCC 4.2", e più in basso, nella categoria '... complier 3.0 - Lingua', l'opzione per selezionare ARC ("Conteggio riferimento automatico Objective-C") non era nemmeno visibile.

Questo è stato particolarmente strano perché ho un altro progetto precedentemente convertito in ARC e mentre il compilatore selezionato era anche "LLVM GCC 4.2", tuttavia la categoria "Lingua" era ancora denominata "Compilatore Apple LLVM 3.0" e l'opzione selezionare ARC era visibile.

Lo stesso compilatore selezionato, ma diverse opzioni offerte per quel compilatore. Strano.

0

Mi sono imbattuto anche nello stesso problema. L'errore che ho commesso è stato che in Build Phases-> Compile Sources ho impostato il flag di un file non ARC come "-fno-objc-arc". Volevo che fosse aggiunto a un file non ARC. L'ho rimosso e ha iniziato a funzionare correttamente.

Problemi correlati