2

ブロックの基礎を理解しようとしています。この簡単なテストを書きました:

NSString *(^print_block) () = ^ (NSString *returned_string){
  return @"this block worked!";  
};

NSLog(@"%@", print_block);

コンソール出力は になると"this block worked!"思っていましたが、代わりに大量のエラー番号などが表示され、次のように終わります。

terminate called throwing an exception

どうした?

編集:答えは使用することが提案されています:

NSLog (@"%@", print_block());

しかし、それもうまくいきません。プログラムはブロック定義の開始時に終了し、コンソールには only(lldb)と表示され、Xcode はブロック定義に小さな緑色の矢印を配置します。矢印には次のように書かれています。

Thread 1: EXC_BAD_ACCESS (code=1, address=0x5f646e71)

うまくいかないことを試しました:

NSString *(^print_block) () = ^ (NSString *returned_string){
    NSString *return_me = @"this block worked!";
    return return_me;  
};

NSLog(@"%@", print_block);

しかし、少なくともこれはプログラムを終了しません。それはうまくいきます。しかし、コンソール出力はまだ間違っています:

<__NSGlobalBlock__: 0x5a58>

4

1 に答える 1

2

Vatevのコメントは正しいです。あなたが書くとき:

NSLog(@"%@", print_block);

print_blockログステートメントのフォーマット文字列の引数としてブロックを渡しています。ブロックを印刷しようとしています。これにより、おそらく[print_block description]呼び出されます。ブロックがメソッドを実装しているかどうかはわかりません-descriptionが、そうでない場合は、認識されないセレクタ例外が発生します。

また、ブロックを宣言した方法が正しくありません。パラメータ リストに戻り値を含める必要はありません。

次のコードは期待どおりに機能します。

NSString *(^print_block)() = ^{
    return @"this block worked!";  
};

NSLog(@"%@", print_block());
于 2012-07-27T16:28:31.203 に答える