我遇到了一个问题,即我的块未捕获其周围的实例变量。这是代码:
__block NSArray *oldArray = self.savedArray;
viewController.block = ^(NSArray *array) {
NSLog(@"array: %@", array);
NSLog(@"oldArray: %@", oldArray); // CRASH
NSLog(@"self: %@", self); // CRASH
};
我的代码块正在被调用,但是如果我尝试访问self或任何实例变量,应用程序将崩溃。另外,我尝试专门调用
__block
,它没有帮助。除了array(来自block)和.block_descriptor外,这些变量也没有显示在变量视图中。谢谢。
最佳答案
它必须是您的属性定义。我只是编码并转储了您拥有的代码:
@property (strong, nonatomic) void (^b)(NSArray *a);
@property (strong, nonatomic) NSArray *array;
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
array = @[ @"1", @"2", @"3" ];
__block NSArray *oldArray = array;
b = ^void(NSArray *a) {
NSLog(@"array: %@", a);
NSLog(@"oldArray: %@", oldArray); // CRASH
NSLog(@"self: %@", self); // CRASH
};
dispatch_async(dispatch_get_main_queue(), ^{ b(oldArray);} );
}
2012-08-09 18:18:04.259 Searcher[49816:f803] array: (
1,
2,
3
)
2012-08-09 18:18:04.260 Searcher[49816:f803] oldArray: (
1,
2,
3
)
2012-08-09 18:18:04.261 Searcher[49816:f803] self: <ViewController: 0x6884550>