2012-03-16 10 views
39

No puedo entender por qué me saleerror extraño NSAssert

use of undeclared identifier _cmd did you mean rcmd 

en la línea donde está NSAssert.

#import <Foundation/Foundation.h> 

int main (int argc, const char * argv[]) 
{ 

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
    int x = 10; 

    NSAssert(x > 11, @"x should be greater than %d", x); 

    [pool drain]; 
    return 0; 
} 

Respuesta

95

Dentro de cada método de Objective-C hay dos variables ocultas id self y SEL _cmd

por lo

- (void)foo:(id)bar; 

es realmente

void foo(id self, SEL _cmd, id bar) { ... } 

y cuando te llaman

[someObject foo:@"hello world"] 

en realidad es

foo(someObject, @selector(foo), @"hello world") 

Si CMD-clic en NSAssert para saltar a su definición, verá que se trata de una macro que utiliza la variable oculta _cmd del método que está llamando desde. Esto significa que si no estás dentro de un método de Objective-c (quizás estás en 'main'), por lo tanto, no tienes un argumento _cmd, no puedes usar NSAssert.

En su lugar, puede utilizar el NSCAssert alternativo.

+0

Explicación realmente buena ... ¡y aprendí algo sobre Objective-C! – Robert

+0

+1 para NSCAssert – onmyway133

0

Debe envolver su cadena en una clase NSString si desea utilizar parámetros de formato. Eso es porque @"" es un constructor predeterminado para un NSString simple. La forma en que está escrito ahora da un tercer parámetro a la función NSAssert y se mete con él.

NSAssert(x > 11, [NSString stringWithFormat:@"x should be greater than %d", x]); 
+0

Recibo el mismo error Si cambio el código a NSAssert (x> 11, @ "x debe ser mayor que"); – foho

+0

La respuesta de @highlycaffeinated es a la que llegué justo ahora. – Alexander

1

tratar de sustituir

NSAssert (x> 11, [NSString stringWithFormat: @ "x debe ser mayor que% d" x]);

con

NSCAssert (x> 11, [NSString stringWithFormat: @ "x debe ser mayor que% d" x]);