奇怪的错误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; }
在每个Objective-c方法里面有两个隐藏variablesid 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跳转到它的定义,你会看到它是一个使用你调用它的方法的隐藏的_cmdvariables的macros。 这意味着如果你不在一个Objective-c方法中(也许你在'main'中),所以你没有_cmd参数,你不能使用NSAssert。
相反,你可以使用替代的NSCAssert。
NSAssert
仅用于Objective-C方法中 。 由于main
是一个C函数,所以请使用NSCAssert
。
尝试更换
NSAssert(x> 11,[NSString stringWithFormat:@“x应该大于%d”,x]);
同
NSCAssert(x> 11,[NSString stringWithFormat:@“x应该大于%d”,x]);
如果要使用格式参数,则必须将string包装在NSString类中。 这是因为@""
是一个普通的NSString的默认构造函数。 现在写的方式给NSAssert
函数提供了第三个参数,并与它NSAssert
。
NSAssert(x > 11, [NSString stringWithFormat:@"x should be greater than %d", x]);