Подтвердить что ты не робот

Странная ошибка 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;
}
4b9b3361

Ответ 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.

Ответ 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]);