使用自定义方法接受块作为输入参数时应用程序崩溃

时间:2012-03-25 09:53:25

标签: cocoa objective-c-blocks

我正在尝试在NSArray类的类中创建一个方法并使用它,它测试数组中的每个对象(字符串)并返回一个包含第一个通过测试的对象的数组。

这是我定义的方法:

- (NSArray *)objectsPassingTest:(BOOL(^)(id obj, BOOL *stop))predicate
{
    NSMutableArray *outputArray = [NSMutableArray array];


    for (id obj in self)
    {
        BOOL *stop;

        if (predicate(obj,stop)) {
            [outputArray addObject:obj];
        }

        if (stop) {
            break;
        }
    }

    return [NSArray arrayWithArray:outputArray];
}

以下是我使用它的代码片段:

NSArray *inputArray = [NSArray arrayWithObjects:@"Objective - C", @"is", @"fun", nil];

NSArray *outputArray = [inputArray objectsPassingTest:^BOOL(id obj, BOOL *stop) {

                if ([obj length] > 2) {
                    *stop = YES;
                    return YES;
                }
                else
                {
                    return NO;
                }

}];

NSLog(@"outputArray - %@",outputArray);

问题是 - 显示正确的输出后,在这种情况下,目标-c,应用程序崩溃。

如果我在某些地方做错了,有人可以建议我吗?

1 个答案:

答案 0 :(得分:0)

如果您不想实现类似于传递测试功能的东西,您可以使用指向BOOL的指针(因为BOOL被定义为“typedef signed char BOOL”)

但您在块中设置了*stop = YES未初始化的BOOL指针,这会让您的应用崩溃。 一种解决方案是设置初始化BOOL值:

    BOOL test = NO;
    BOOL *stop = &test;

块的好指南在这里:http://cocoasamurai.blogspot.de/2009/09/guide-to-blocks-grand-central-dispatch.html