0

次の3つのコードが同じことをしているのをどこかで見ました。

ループの使用:

BOOL stop = 0;
for (int i = 0 ; i < [theArray count] ; i++) {
    NSLog(@"The object at index %d is %@",i,[theArray objectAtIndex:i]);
    if (stop)
        break;
}

高速列挙の使用:

int idx = 0;
BOOL stop = 1;

for (id obj in theArray) {
    NSLog(@"fast emuration approch @ x %d is %@",idx,obj);
    if (stop)
        break;
    idx++;
}

ブロックの使用:

[theArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop){

    NSLog(@"the block approch at x %d is %@",idx,obj);
}];

しかし、私が理解していないのは-

  1. ブロックアプローチで外部から停止を設定するにはどうすればよいですか?
  2. ブロックアプローチでidxを設定するにはどうすればよいですか?
  3. BOOL宣言は、ブロックアプローチでは異常です。なぜですか?(ブロック内の値も変更できないので、そのような宣言のせいですか?)
4

2 に答える 2

2
  1. ブロック内でポイントされた値のみを変更できますがstop、セマンティクスに関する限り、サンプルで示されているより広いスコープの変数を使用していない限り、他のアプローチでも変更を加えることはできません。コードを記述し、別のスレッドで操作します。
  2. できません。ブロックに記述したコードは、基本的にループ本体でidxありstop、ブロックの呼び出しコンテキストから渡され、そのコンテキスト内の反復を制御するのに役立ちます。つまり、メソッドの実装内で、ローカルをenumerateObjectsUsingBlock:設定し、高速列挙メソッドの場合idxstop同様に、それらを引数としてブロックに渡します。
  3. BOOL呼び出し元に表示される値を変更できるへのポインタを受け取ります。つまり、に設定*stopしたブロック内からYES、の実装はenumerateObjectsUsingBlock:、そのローカル変数stopがに設定されていることを確認しYESます。これは、Cで参照によって複数の引数を返す一般的な方法です。
于 2013-03-01T05:47:55.107 に答える
0

これを試して :

__block bool stop = YES;
__block NSUInteger idx = 0;

[theArray enumerateObjectsUsingBlock:^(id obj){

    NSLog(@"the block approch at x %d is %@",idx,obj);
    idx++;

}];
于 2013-03-01T06:37:23.503 に答える