Tôi có một số mã khối đệ quy trong mục tiêu-c đang gây ra lỗi EXC_BAD_ACCESS.Khối đệ quy mục tiêu-c với chủ đề EXC_BAD_ACCESS
- (void) doSomethingWithCompletion:(void (^)())completion {
if (completion) {
dispatch_async(dispatch_get_main_queue(), completion);
}
}
- (void) testBlocks {
NSString *testString = @"hello";
__block NSInteger count = 0;
__block __weak void (^weak_block)(NSString *);
void(^strong_block)(NSString *);
weak_block = strong_block = ^(NSString *str) {
[self doSomethingWithCompletion:^{
NSLog(@"number: %zd", count);
if (++count < 10) {
weak_block(str);
}
}];
};
strong_block(testString);
}
Lỗi xảy ra trên weak_block (str) mà tôi giả định là vì nó được phát hành khi dispatch_async được gọi. Gọi strong_block (str) trong đó diễn ra khi nó được khai báo bằng __block như vậy:
__block void(^strong_block)(NSString *);
Nguyên nhân một cảnh báo 'chụp 'strong_block' mạnh mẽ trong khối này là khả năng dẫn đến một chu kỳ giữ'.
Vì vậy, tôi đã thay đổi phương pháp testBlock không sử dụng một tham chiếu yếu như sau:
- (void) testBlocks {
NSString *testString = @"hello";
__block NSInteger count = 0;
__block void (^inner_block)(NSString *);
void(^strong_block)(NSString *);
inner_block = strong_block = ^(NSString *str) {
[self doSomethingWithCompletion:^{
NSLog(@"number: %zd", count);
if (++count < 10) {
inner_block(str);
}
}];
};
strong_block(testString);
}
Nhưng tôi không chắc chắn nếu điều này gây ra một giữ lại chu kỳ hoặc nếu thêm
__block void (^inner_block)(NSString *) = weak_block;
bên trong khối thay vì sẽ gây ra một chu kỳ giữ lại là tốt. Cách chính xác để xử lý tình huống này là gì?
não của anh đau nhìn này .. –