2

我使用一个 nsmutablearray 创建了一个二维数组,并且有一个方法:

- (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. 只使用一个 BOOL *stop 而不是 stopRow 和 stopColumn (因为我正在使用 ARC),或者
  2. 在外部块内添加一个 BOOL isStop 并且内部块可以将其设置为 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 回答