2012-11-13 24 views
7

ho la seguente riga di codice nella mia applicazione Mac OS X:NSLog dandomi avvertimenti che non sono correggibili

NSLog(@"number of items: %ld", [urlArray count]); 

E ottengo l'avvertimento: "Format specifica di tipo 'lunga', ma l'argomento è di tipo 'NSUInteger' (aka 'unsigned int')"

Tuttavia, se cambio il mio codice a:

NSLog(@"number of items: %u", [urlArray count]); 

ottengo l'avvertimento:

formato specifica tipo 'unsigned int', ma l'argomento è di tipo 'NSUInteger' (aka 'unsigned long')

Allora lo cambio a

NSLog(@"number of items: %u", [urlArray count]); 

ma ottengo l'avvertimento: specifica il formato digita 'unsigned long' ma l'argomento ha tipo 'NSUInteger' (alias 'unsigned int')

Come posso impostare il mio NSLog in modo che non generi un avviso? Se seguo i suggerimenti di Xcode, entro in un ciclo infinito di modifica dell'identificatore di formato, ma gli avvertimenti non spariscono mai.

risposta

14

Sì, questo è fastidioso. Credo che sia una cosa a 32/64 bit. La cosa più semplice da fare è gettato a una lunga:

NSLog(@"number of items: %lu", (unsigned long)[urlArray count]); 
6

Il portability guide per applicazioni universali suggeriscono fusione in questo caso.

NSLog(@"number of items: %ld", (unsigned long)[urlArray count]); 
+0

Questo sembra piuttosto inutile, ma lo fa chiarire gli avvertimenti. – Jackson

+3

Non sono sicuro che faccia la differenza, ma probabilmente dovresti fare lo stesso tipo dello specificatore di formato. Quindi (unsigned long) sarebbe% lu, o (long) sarebbe% ld –

+0

@darren fa la differenza, non farlo è un comportamento indefinito. –