2012-03-16 15 views
39

Nie mogę zrozumieć, dlaczego mambłąd Weird NSAssert

use of undeclared identifier _cmd did you mean rcmd 

na linii, gdzie NSAssert jest.

#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; 
} 

Odpowiedz

95

Wewnątrz każdej metody objective-c są dwa ukryte zmienne id self i SEL _cmd

tak

- (void)foo:(id)bar; 

jest naprawdę

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

i kiedy zadzwonić

[someObject foo:@"hello world"] 

to jest rzeczywiście

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

Jeśli CMD-kliknij NSAssert skoczyć do jego definicji widać, że jest to makro, które używa ukrytego _cmd zmienną metody jesteś wywołanie go z. Oznacza to, że jeśli nie jesteś w metodzie Objective-c (być może jesteś w "main"), więc nie masz argumentu _cmd, nie możesz użyć NSAssert.

Zamiast tego można użyć alternatywnego pliku NSCA.

+0

Naprawdę dobre wyjaśnienie ... i nauczyłem się czegoś o celu C! – Robert

+0

+1 dla NSCAssert – onmyway133

0

Musisz zawinąć ciąg w klasie NSString, jeśli chcesz używać parametrów formatu. To dlatego, że @"" jest domyślnym konstruktorem dla zwykłego NSString. Sposób, w jaki jest teraz zapisywany, daje trzeci parametr funkcji NSAssert i komunikuje się z nią.

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

Otrzymuję ten sam błąd, jeśli zmienię kod na NSAssert (x> 11, @ "x powinien być większy niż"); – foho

+0

Odpowiedź od @highlycaffeinated jest tą, którą osiągnąłem właśnie teraz. – Alexander

1

spróbować zastąpić

NSAssert (x> 11 [NSString stringWithFormat: @ "x powinna być większa niż% d", X]);

z

NSCAssert (x> 11 [NSString stringWithFormat: @ "x powinna być większa niż% d", X]);