Tôi đang cố gắng tạo đệ quy bằng cách sử dụng các khối. Nó hoạt động trong một thời gian, nhưng cuối cùng nó bị treo và cho tôi một ngoại lệ truy cập xấu. Đây là mã của tôi:EXC_BAD_ACCESS khi sử dụng khối đệ quy
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);
Giải thích: Tôi có một lớp Square
mà có một BOOL nuked
. Nó cũng có một NSArray adjacentSquares
chứa các ô vuông khác.
Tôi muốn kiểm tra xem một hình vuông hoặc một trong các hình vuông 'được kết nối' của nó có bị nhòe hay không.
Mảng processedSquares
là để theo dõi các ô vuông tôi đã kiểm tra để ngăn chặn đệ quy vô hạn.
Khi tôi chạy điều này, nó thực hiện rất nhiều cuộc gọi của khối này (như mong đợi). Nhưng tại một số điểm, nó bị treo ở dòng cuối cùng với một ngoại lệ truy cập xấu.
Tôi cũng có được điều này trong bảng điều khiển
Không thể truy cập bộ nhớ tại 0x1 địa chỉ
Không thể truy cập bộ nhớ tại địa chỉ 0x1
Không thể truy cập bộ nhớ tại địa chỉ 0x1
Không thể truy cập bộ nhớ tại địa chỉ 0x1
cảnh báo: Hủy bỏ cuộc gọi - mã objc trên ngăn xếp của luồng hiện tại làm cho điều này không an toàn.
Tôi không quen thuộc với các khối và đệ quy. Bất kỳ ý tưởng?
Sửa 1
Theo yêu cầu, các vết lùi:
#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
Ồ, duh, tôi không thể tin rằng mình đã bỏ lỡ điều đó. Nghiêm túc. Nắm bắt tốt. Đã xóa không trả lời của tôi (vẫn không cần '__block' trên mảng đó, mặc dù). – bbum
Điều này làm việc cho tôi. Cảm ơn bạn! – Rits
Tôi đã nhận được một cảnh báo cho * Chụp 'chặn' mạnh mẽ trong khối này có khả năng dẫn đến một chu kỳ giữ lại *. Một giải pháp xuất hiện ở đây: http://stackoverflow.com/questions/15638751/how-to-fix-capturing-block-strongly-in-this-block-is-likely-to-lead-to-a-reta – ishahak