objective c - Error extraño NSAssert
objective-c (4)
Dentro de cada método de Objective-c hay dos variables ocultas id self
y SEL _cmd
asi que
- (void)foo:(id)bar;
realmente es
void foo(id self, SEL _cmd, id bar) { ... }
y cuando llamas
[someObject foo:@"hello world"]
en realidad es
foo( someObject, @selector(foo), @"hello world")
Si pulsa CMD en NSAssert para saltar a su definición, verá que es una macro que utiliza la variable _cmd oculta del método desde el que la llama. Esto significa que si no está dentro de un método Objective-c (quizás esté en ''main''), por lo tanto, no tiene un argumento _cmd, no puede usar NSAssert.
En su lugar puedes usar la alternativa NSCAssert.
No puedo entender por qué me sale
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;
}
Tienes que envolver tu cadena en una clase NSString si quieres usar parámetros de formato. Esto se debe a que @""
es un constructor predeterminado para una NSString simple. La forma en que está escrito ahora le 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]);
Tratar de reemplazar
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]);
NSAssert
solo debe utilizarse dentro de los métodos de Objective-C . Como main
es una función C, use NSCAssert
en NSCAssert
lugar.