Странная ошибка NSAssert - PullRequest
       7

Странная ошибка NSAssert

46 голосов
/ 16 марта 2012

Я не могу понять, почему я получаю

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

Ответы [ 4 ]

103 голосов
/ 16 марта 2012

Внутри каждого метода 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.

30 голосов
/ 16 марта 2012

NSAssert предназначен только для использования в методах Objective-C . Поскольку main является функцией C, используйте NSCAssert.

1 голос
/ 16 марта 2012

Попробуйте заменить

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

с

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

0 голосов
/ 16 марта 2012

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

...