在VC' s之间传递数据的块 - EXC_BAD_ACCESS

时间:2016-02-29 21:46:53

标签: ios objective-c objective-c-blocks exc-bad-access

我使用块从视图控制器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);
}];

我已经尝试过几次无法正常工作。如果有人可以帮助我,我会非常感激。

1 个答案:

答案 0 :(得分:0)

  1. 块属性应声明为copy

    @property (nonatomic, copy) void (^simpleBlock)(void);
    
  2. 然后,在传递块时,不要在其上调用复制方法。

    VC3.onDismiss = ^(VC3 *sender, NSMutableArray *details)
    {
        // do stuff here
    };
    
  3. 最后,您应该在执行之前检查该块是否为nil

  4. 问题

    在视图控制器被解除后,您似乎正在调用该块。这意味着您正在尝试访问已释放的内存。问题在这里:

     [self dismissViewControllerAnimated:YES completion:^{
       NSMutableArray *details = [NSMutableArray array];
        [details addObject:x];
        [details addObject:y];
        [details addObject:z];
    
        self.onDismiss(self, details);
    }];
    

    您解雇控制器,然后在完成处理程序中访问它的属性。