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)
您需要将block属性声明为copy
:
@property(nonatomic, copy) SaveBlock saveBlock;
Run Code Online (Sandbox Code Playgroud)
你不能使用assign
或strong
.原因是你需要确保你有自己的块副本.传入的那个可能在堆栈框架上,当你运行块时可能会消失.因此,您需要触发a Block_copy()
以确保将块复制到堆中(或者只有在已经存在时才保留).
[注意:这个解释非常简洁.如果你想完全理解它,我建议你去看看块运行时.]
归档时间: |
|
查看次数: |
804 次 |
最近记录: |