2012-03-16 28 views
39

私はNSAssertがあるライン上の奇妙なエラーNSAssert

use of undeclared identifier _cmd did you mean rcmd 

を取得し、なぜ私が理解することはできません。

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

答えて

95

2つの隠し変数id selfSEL _cmd

があるので

- (void)foo:(id)bar; 

本当に

void foo(id self, SEL _cmd, id bar) { ... } 

、あなたが

[someObject foo:@"hello world"] 
を呼んで

あなたはそれはあなたがからそれを呼び出しているメソッドの_cmd隠れ変数を使用するマクロであることがわかります、それの定義にジャンプしNSAssertにcmdをクリックすると、それは実際に

foo(someObject, @selector(foo), @"hello world") 

です。これはObjective-cのメソッドの中にいない(おそらくあなたが 'main'にある)場合、_cmd引数を持たないので、NSAssertを使うことができないということです。

代わりに代替NSCAssertを使用できます。

+0

本当に良い説明...そして私は客観的なCについて何かを学んだ! – Robert

+0

+1 NSCAssert – onmyway133

0

フォーマットパラメータを使用する場合は、文字列をNSStringクラスにラップする必要があります。これは、@""がプレーンなNSStringのデフォルトコンストラクタであるためです。それが今書かれている方法は、NSAssert関数に3番目のパラメータを与え、それを使いこなします。

NSAssert(x > 11, [NSString stringWithFormat:@"x should be greater than %d", x]); 
+0

私はNSAssert(x> 11、@ "xは"より大きい必要があります)にコードを変更する場合、同じエラーが発生します。 – foho

+0

@highlycaffeinatedからの答えは、私が今すぐに到達したものです。 – Alexander

1

NSAssert(X> 11、[NSStringのstringWithFormat:、X "xはD%より大きくなければならない" @])を交換してみてください。

NSCAssert(X> 11、[NSStringのstringWithFormat:、X "Xは%dよりも大きくなければならない" @])と