块的执行流程是什么?

时间:2013-05-03 11:32:09

标签: ios objective-c macos objective-c-blocks

我正在使用Objective-C块,但是我在理解下面的代码执行时遇到了麻烦。

以下是代码:

NSArray *array = @[@"A", @"B", @"C", @"A", @"B", @"Z", @"G", @"are", @"Q"];
NSSet *filterSet = [NSSet setWithObjects: @"A", @"Z", @"Q", nil];

BOOL (^test)(id obj, NSUInteger idx, BOOL *stop);

test = ^(id obj, NSUInteger idx, BOOL *stop) {

    if (idx < 5) {
        if ([filterSet containsObject: obj]) {
            return YES;
        }
    }
    return NO;
};

NSIndexSet *indexes = [array indexesOfObjectsPassingTest:test];
NSLog(@"indexes: %@", indexes);

输出:

indexes: <NSIndexSet: 0x10236f0>[number of indexes: 2 (in 2 ranges), indexes: (0 3)]

在此方法[array indexesOfObjectsPassingTest:test];中,test块是我传递的参数。

但是在上面的块中,test = ^(id obj, NSUInteger idx, BOOL *stop)它可以采用的参数objidxstop的值是多少?他们来自哪里?

1 个答案:

答案 0 :(得分:2)

您的阵列中有9个项目。所以test块执行了9次 每次,obj都将成为数组中的对象。 idx将成为索引。

第一次:obj = @“A”idx = 0

第二次:obj = @“B”idx = 1

如果您想提前退出,

stop是您可以写入的值。因此,如果在第5次通过块,你不想再这样做了。你可以做*stop=YES;