Странная ошибка 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;
}
Ответы
Ответ 1
Внутри каждого метода 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")
Если вы нажмете на NSAssert, чтобы перейти к определению, вы увидите, что это макрос, который использует скрытую переменную _cmd метода, из которого вы вызываете ее. Это означает, что если вы не используете метод Objective-c (возможно, вы находитесь в 'main'), поэтому у вас нет аргумента _cmd, вы не можете использовать NSAssert.
Вместо этого вы можете использовать альтернативный NSCAssert.
Ответ 2
NSAssert
предназначен только для методов Objective-C. Поскольку main
является функцией C, используйте NSCAssert
вместо этого.
Ответ 3
Попробуйте заменить
NSAssert (x > 11, [NSString stringWithFormat: @ "x должно быть больше% d", x]);
с
NSCAssert (x > 11, [NSString stringWithFormat: @ "x должно быть больше% d", x]);
Ответ 4
Вы должны перенести свою строку в класс NSString, если хотите использовать параметры формата. Это потому, что @""
является конструктором по умолчанию для простой NSString. То, как оно написано, теперь дает третий параметр функции NSAssert
и путается с ним.
NSAssert(x > 11, [NSString stringWithFormat:@"x should be greater than %d", x]);