objective-c nsassert

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]);