我使用块从视图控制器VC3传递数据,该控制器出现在由VC1推送的模态视图中。显示的模态是VC2,它在被解雇之前显示VC3。
使用块时出现EXC_BAD_ACCESS错误。
以下是代码。
VC1.m
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
self.VC2 = [storyboard instantiateViewControllerWithIdentifier:@"VC2"];
VC3 *VC3 = [storyboard instantiateViewControllerWithIdentifier:@"VC3"];
VC3.onDismiss = [^(VC3 *sender, NSMutableArray *details)
{
//set stuff here
} copy];
[self presentViewController:VC2 animated:YES completion:nil];
VC3.h
@property (nonatomic, strong) void (^onDismiss)(VC3 *sender, NSMutableArray* details);
VC3.m
[self dismissViewControllerAnimated:YES completion:^{
NSMutableArray *details = [NSMutableArray array];
[details addObject:x];
[details addObject:y];
[details addObject:z];
self.onDismiss(self, details);
}];
我已经尝试过几次无法正常工作。如果有人可以帮助我,我会非常感激。
答案 0 :(得分:0)
块属性应声明为copy
@property (nonatomic, copy) void (^simpleBlock)(void);
然后,在传递块时,不要在其上调用复制方法。
VC3.onDismiss = ^(VC3 *sender, NSMutableArray *details)
{
// do stuff here
};
最后,您应该在执行之前检查该块是否为nil
。
在视图控制器被解除后,您似乎正在调用该块。这意味着您正在尝试访问已释放的内存。问题在这里:
[self dismissViewControllerAnimated:YES completion:^{
NSMutableArray *details = [NSMutableArray array];
[details addObject:x];
[details addObject:y];
[details addObject:z];
self.onDismiss(self, details);
}];
您解雇控制器,然后在完成处理程序中访问它的属性。