49

なんで受かったのか理解不能

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

5 に答える 5

111

すべての Objective-c メソッド内には、2 つの隠し変数id 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 を cmd-クリックしてその定義にジャンプすると、呼び出し元のメソッドの非表示の _cmd 変数を使用するマクロであることがわかります。これは、Objective-c メソッド内にいない場合 (おそらく「メイン」にいる場合)、したがって _cmd 引数がない場合、NSAssert を使用できないことを意味します。

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

于 2012-03-16T15:18:44.600 に答える
31

NSAssert Objective-Cメソッド内でのみ使用することを目的としていますmainはC関数なので、NSCAssert代わりに使用してください。

于 2012-03-16T15:08:48.550 に答える
1

交換してみる

NSAssert(x > 11, [NSString stringWithFormat:@"x は %d より大きい必要があります", x]);

NSCAssert(x > 11, [NSString stringWithFormat:@"x は %d より大きい必要があります", x]);

于 2012-03-16T15:01:55.543 に答える
0

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

NSAssert(x > 11, [NSString stringWithFormat:@"x should be greater than %d", x]);
于 2012-03-16T14:56:41.070 に答える