奇怪的错误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 selfSEL _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]); 
Interesting Posts