警告:
capturing self strongly in this block is likely to lead to a retain cycle
意思是block会retain一次,所以使用前最好
__block ViewController *strongBlock = self;
__block ViewController *strongBlock = self;
简单代码如下:
self.tableViewDelegate.didSelectedBlock = ^(UITableView *tableview, NSIndexPath *indexPath) {
MessageViewController *messageVC = [[MessageViewController alloc]init];
[self presentViewController:messageVC animated:YES completion:nil];
};
修改后的代码:
__block ViewController *strongBlock = self;
self.tableViewDelegate.didSelectedBlock = ^(UITableView *tableview, NSIndexPath *indexPath) {
MessageViewController *messageVC = [[MessageViewController alloc]init];
[self presentViewController:messageVC animated:YES completion:nil];
};
这样就没有警告了!!!
__block关键字:
根据内存地址变化可见,__block
所起到的作用就是只要观察到该变量被 block 所持有,就将“外部变量”在栈中的内存地址放到了堆中。进而在block内部也可以修改外部变量的值。原先地址是否直接抛弃不用再继续研究.
Block不允许修改外部变量的值,Apple这样设计,应该是考虑到了block的特殊性,block也属于“函数”的范畴,变量进入block,实际就是已经改变了作用域。在几个作用域之间进行切换时,如果不加上这样的限制,变量的可维护性将大大降低。又比如我想在b