阻止回调崩溃

Oys*_*sio 1 iphone objective-c ios objective-c-blocks

我在viewControllers之间使用Blocks而不是委托进行回调,但是我无法弄清楚为什么这种情况不起作用:

所以我有一个调用detailViewController的mainViewController,当返回tableView时,需要重新加载mainViewController上的属性.

DetailViewController *actionDetail = [[DetailViewController alloc]initWithSaveBlock:^{
        [self.tableView reloadData]  //app crashes here
}];
Run Code Online (Sandbox Code Playgroud)

在detailViewController中,当用户点击"保存按钮"时,会调用"保存"

- (void)save
{
    if (self.saveBlock)
        self.saveBlock();

    [self dismissModalViewControllerAnimated:YES];
}
Run Code Online (Sandbox Code Playgroud)

由于某种原因,[self.tableView reloadData]这不符合[self dismissModalViewControllerAnimated:YES].如果我删除其中一个应用程序似乎工作正常,显然比我错过了预期的行为.

当应用程序崩溃时,控制台中的消息是:

Previous frame inner to this frame (gdb could not unwind past this frame)
Run Code Online (Sandbox Code Playgroud)

任何人都知道为什么这不起作用?

更新: SaveBlock定义如下

typedef void (^SaveBlock)();

@interface DetailViewController : UIViewController
{

}
@property(nonatomic,assign)SaveBlock saveBlock;
Run Code Online (Sandbox Code Playgroud)

mat*_*way 7

您需要将block属性声明为copy:

@property(nonatomic, copy) SaveBlock saveBlock;
Run Code Online (Sandbox Code Playgroud)

你不能使用assignstrong.原因是你需要确保你有自己的块副本.传入的那个可能在堆栈框架上,当你运行块时可能会消失.因此,您需要触发a Block_copy()以确保将块复制到堆中(或者只有在已经存在时才保留).

[注意:这个解释非常简洁.如果你想完全理解它,我建议你去看看块运行时.]