Сбой приложения при использовании пользовательского метода, принимающего блок в качестве входного параметра - PullRequest
0 голосов
/ 25 марта 2012

Я пытаюсь создать метод в категории класса 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);

Проблема в том, что после отображения правильного вывода Objective -c в этом случае происходит сбой приложения.

Может кто-нибудь подсказать мне, если я что-то не так делаю где-то?

1 Ответ

0 голосов
/ 25 марта 2012

Если вы не хотите реализовывать что-то вроде функции прохождения теста, вы можете использовать указатель на BOOL (потому что BOOL определен как "typedef signature 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

...