2012-03-16 2 views
39

Я не могу понять, почему я получаюWeird ошибка NSAssert

use of undeclared identifier _cmd did you mean rcmd 

на линии, где 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; 
} 

ответ

95

Внутри каждого метода Objective-C есть две скрытые переменные id self и SEL _cmd

так

- (void)foo:(id)bar; 

действительно

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

и когда вы звоните

[someObject foo:@"hello world"] 

это на самом деле

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

Если вы Cmd кнопки мыши на NSAssert, чтобы перейти к ее определению, вы увидите, что это макрос, который использует скрытую _cmd переменную метода вы вызываете его с. Это означает, что если вы не используете метод Objective-c (возможно, вы находитесь в «main»), поэтому у вас нет аргумента _cmd, вы не можете использовать NSAssert.

Вместо этого вы можете использовать альтернативный NSCAssert.

+0

Действительно хорошее объяснение ... и я кое-что узнал об объективе-C! – Robert

+0

+1 для NSCAssert – onmyway133

0

Вы должны обернуть свою строку в классе NSString, если хотите использовать параметры формата. Это потому, что @"" является конструктором по умолчанию для простой NSString. То, как оно написано, теперь дает третий параметр функции NSAssert и беспорядок с ним.

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

Я получаю ту же ошибку. Если я изменю код на NSAssert (x> 11, @ "x должен быть больше"); – foho

+0

Ответ от @highlycaffeinated - это тот, который я достиг почти сейчас. – Alexander

1

Попытка заменить

NSAssert (х> 11, [NSString stringWithFormat: @ "х должна быть больше, чем% D", х]);

с

NSCAssert (х> 11, [NSString stringWithFormat: @ "х должна быть больше, чем% D", х]);