2013-10-04 3 views
13

nonnull funziona per le funzioni C ma non per i metodi obj-c. Per essere chiari, io sto suggerendo questoPerché non c'è un attributo 'nonnil' per clang?

- (void)doSomethingWithRequiredString:(NSString * __attribute((nonnil)))requiredString 
            bar:(NSString *)optionalString); 

o (più come non nulli)

- (void)doSomethingWithRequiredString:(NSString *)requiredString 
            bar:(NSString *)optionalString) 
__attribute((nonnil(0))); 

ho perplessi sul fatto se c'è o non c'è una buona ragione tecnica. Capisco che clang potrebbe davvero utilizzare l'attributo solo per un controllo del tempo di compilazione o analisi statica, ma sembra ortogonale. C'è qualche forte motivo non per avere questo?

+0

Il mio sospetto: 'clang' è un grande progetto. I suoi sviluppatori hanno cose migliori da fare. –

risposta

26

Si può totalmente. L'unica cosa che si sta facendo male è pensare che i parametri del metodo sono 0-indicizzati, quando in realtà sono 1-indicizzati (oh, ed è nonnull, non nonnil):

- (void)doSomethingWithRequiredString:(NSString *)requiredString 
            bar:(NSString *)optionalString 
     __attribute((nonnull(1))); 

Ora, quando si tenta di uso che:

id thing = ...; 
[thing doSomethingWithRequiredString:nil bar:@"42"]; 

Xcode vi avviserà con un dicendo "Null passata a una callee che richiede un argomento non nullo".

Inoltre, se si lascia il "(1)" parte della __attribute, si presume che il requisito di non-nil si applica a tutte le parametri.

Clang riconosce gli attributi del CCG, e la definizione di GCC dell'attributo nonnull è qui: http://gcc.gnu.org/onlinedocs/gcc-4.0.0/gcc/Function-Attributes.html#index-g_t_0040code_007bnonnull_007d-function-attribute-1733


Aggiornamento: Come di Xcode 6.3 una sintassi più pulito è supportata.

In proprietà e metodi le parole chiave sono nullable, nonnull e null_unspecified.

Così la vostra firma del metodo sarebbe diventato questo:

- (void)doSomethingWithRequiredString:(nonnull NSString *)requiredString 
            bar:(nullable NSString *)optionalString; 
+0

Mille grazie. Era l'indicizzazione che mi ha procurato. È stato inaspettato. – griotspeak

+0

@griotspeak si, anche questo mi ha buttato per un giro. –

+0

@DaveDeLong c'è una versione per parametro più semplice di questo attributo, simile a '__unused'? – danyowdee