Я пытаюсь создать рекурсию, используя блоки. Это работает некоторое время, но в конечном счете это терпит крах и дает мне исключение плохого доступа. Это мой код:
BOOL (^Block)(Square *square, NSMutableArray *processedSquares) = ^(Square *square, NSMutableArray *processedSquares) {
[processedSquares addObject:square];
if (square.nuked) {
return YES; // Found a nuked square, immediately return
}
for (Square *adjacentSquare in square.adjacentSquares) {
if ([processedSquares containsObject:adjacentSquare]) {
continue; // Prevent infinite recursion
}
if (Block(adjacentSquare, processedSquares)) {
return YES;
}
}
return NO;
};
__block NSMutableArray *processedSquares = [NSMutableArray array];
BOOL foundNukedSquare = Block(square, processedSquares);
Объяснение: У меня есть класс Square
с BOOL nuked
. Он также имеет NSArray adjacentSquares
, содержащий другие квадраты.
Я хочу проверить, является ли квадрат или один из его «связанных» квадратов нюками или нет.
Массив processedSquares
предназначен для отслеживания квадратов, которые я проверил, чтобы предотвратить бесконечную рекурсию.
Когда я запускаю это, он выполняет много вызовов этого блока (как и ожидалось). Но в какой-то момент происходит сбой на последней строке с исключением из-за плохого доступа.
Я также получаю это в консоли:
Невозможно получить доступ к памяти по адресу 0x1
Невозможно получить доступ к памяти по адресу 0x1
Невозможно получить доступ к памяти по адресу 0x1
Невозможно получить доступ к памяти по адресу 0x1
предупреждение: отмена вызова - код objc в стеке текущего потока делает это небезопасным.
Я не очень знаком с блоками и рекурсией. Есть идеи?
Редактировать 1
По запросу, обратный след:
#0 0x00000001 in ??
#1 0x000115fb in -[Square connectedToNukedSquare] at Square.m:105
#2 0x00010059 in __-[Bot makeMove]_block_invoke_1 at Bot.m:94
#3 0x91f3f024 in _dispatch_call_block_and_release
#4 0x91f31a8c in _dispatch_queue_drain
#5 0x91f314e8 in _dispatch_queue_invoke
#6 0x91f312fe in _dispatch_worker_thread2
#7 0x91f30d81 in _pthread_wqthread
#8 0x91f30bc6 in start_wqthread