2011-02-09 7 views
11

Prima di Xcode 4 con LLVM questo passava inosservato al compilatore. L'assegnazione all'interno del condizionale è perfettamente intenzionale e un idioma di cacao.if (self = [super init]) - Avviso LLVM! Come stai affrontando?

Xcode 4 con compilatore LLVM selezionato non riesce mai a lamentarsi, e non solo in fase di compilazione, non appena viene digitato viene visualizzata l'icona di avviso gialla. Disattivare gli avvertimenti come errori e ignorare semplicemente l'avviso non sembra una buona idea. Spostando il compito fuori dalle parentesi si spreca spazio. Dovendo disattivare questo avviso con un pragma per ogni nuovo progetto diventerà noioso.

Come ci si comporta? Qual è il nuovo idioma?

+1

Durante la formattazione del codice, "sprecare spazio" non è necessariamente uno spreco. Linee di rientro per riflettere la struttura del programma "spreca spazio" ma non lo fai? – JeremyP

+0

Sprecare spazio relativo all'idioma di assegnare/valutare solo per sé. Mi interessa molto il modo in cui il codice appare denso e non mi dispiace affatto le righe extra quando rende le cose più chiare. –

+1

Ama il doppio JeremyP negativo. –

risposta

18

Questo è in realtà un avvertimento molto antica, è stato appena fuori di default con GCC e con Clang 1.6. Xcode dovrebbe davvero darti un suggerimento su come risolverlo - cioè, raddoppiare le parentesi.

if ((self = [super init])) { ... } 

Il paio di parentesi dice al compilatore che davvero ha intenzione di fare un incarico al condizionale.

+0

Quindi, ho pensato che sapessi di cosa si lamentava, quindi non ho letto il suggerimento. –

4

Basta usare due coppie di parentesi per rendere chiaro al compilatore che si sta assegnando apposta:

if ((self = [super init])) 
10

Se si crea un metodo init dalle più recenti macro di testo Xcode, avrete notato che il nuovo modo di fare beati init è:

- (id)init { 
    self = [super init]; 
    if (self) { 
     <#initializations#> 
    } 
    return self; 
} 

questo modo si evita l'avvertimento. Anche se personalmente nel mio codice, se mi imbatto in questo, ho semplicemente applicato il metodo mostrato da Kevin.

Qualcosa di buono da sapere!

+2

Non proprio sicuro si possa chiamare questo un nuovo "modo benedetto".Apple è sempre stata incoerente riguardo agli stili di codifica. –

+1

Non ho detto che gli stili precedenti non sono stati benedetti una volta ... Nel calcolo, nessuna benedizione è per sempre. Quindi forse è più di un "fascino". –

+0

Entrambe le risposte di Kevin e Kendall sono valide. La differenza tra loro è che gli assegni di Kendall per vedere se l'inizializzazione della superclasse funzionava. Aaron Hillegass spiega nel suo libro che alcuni inizializzatori restituiranno zero se l'inizializzazione della superclasse fallisce. Ho l'impressione che un caso del genere sarebbe patologico (un errore di runtime), motivo per cui non sembrano esserci esempi di riprovare l'inizializzazione in caso di ritorno nullo. Sono fuori dalla mia profondità qui, però, e solo speculando su quel po '. Mi piacerebbe vedere una spiegazione autorevole e approfondita. –

3

Aprire la barra di navigazione del progetto e scegliere il progetto. Nella finestra principale che appare, scegli "Tutti". Nella sezione "LLVM compilatore 2.0 - Avvisi", seleziona "Altre bandiere di avviso". Aggiungi la bandiera "Wno-idiomatic-parentheses" per "Debug" e "Release". Ora pulisci e ricompila. enter image description here

0

Come pochi altri hanno suggerito di aggiungere un ulteriore set di parentesi.

sono lontano da un normale guru espressione quindi sentitevi liberi di pulire questo, ma questo trovare e sostituire in Xcode fisso circa il 95% dei miei casi:

Replace: if\s*\({1}\s*self\s*={1}(.*)\){1} 
With: if ((self =\1)) 

stare attenti perché questo sarà anche trovare se (auto == ...), quindi usa l'anteprima e deseleziona quelli o correggi la mia espressione regolare :)

E inizia a usare self = ...; se (auto), è più pulito.

Problemi correlati