2

1つのnsmutablearrayを使用して2次元配列を作成しましたが、次の方法があります。

- (void)enumerateObjectsUsingBlock:(void (^)(id obj, NSUInteger row, NSUInteger column, BOOL *stop))block
{
    [self.internalArray enumerateObjectsUsingBlock:^(id obj, NSUInteger rowIdx, BOOL *stopRow){
        NSMutableArray *rowArray = obj;
        [rowArray enumerateObjectsUsingBlock:^(id obj, NSUInteger columnIdx, BOOL *stopColumn){
            block(obj, rowIdx, columnIdx, stopColumn);
        }];
    }];
}

'block'がstopColumnをYESに設定している場合、stopRowもYESである必要があることを外部ブロックに通知する方法が必要であることに気付きましたが、次のことができるかどうかわかりません。

  1. (ARCを使用しているので)stopRowとstopColumnの代わりに1つのBOOL * stopを使用するか、または
  2. 外側のブロック内にBOOLisStopを追加すると、内側のブロックでstopColumnに設定できますか?
4

1 に答える 1

2

これは機能するはずです:

- (void)enumerateObjectsUsingBlock:(void (^)(id obj, NSUInteger row, NSUInteger column, BOOL *stop))block
{
    [self.internalArray enumerateObjectsUsingBlock:^(id obj, NSUInteger rowIdx, BOOL *stopRow){
        NSMutableArray *rowArray = obj;
        [rowArray enumerateObjectsUsingBlock:^(id obj, NSUInteger columnIdx, BOOL *stopColumn) {
            block(obj, rowIdx, columnIdx, stopColumn);
            // Add this line:
            *stopRow = *stopColumn;
        }];
    }];
}

stopRowブロックは、ポインターを含め、その本体が使用するすべての変数をキャプチャする必要があります。ポインター自体を変更するのではなく、ポインターが指すデータのみを変更するため、他に何もする必要はありません(ポインター自体を変更する必要がある場合は、として宣言された追加の一時変数が必要になります__block)。

于 2012-08-06T20:54:27.690 に答える