iOS之Block报错:capturing 'self' strongly in this block is likely to lead to a retain cycle
如何避免?
3、__strong: 赋值给这个变量的对象会自动被retain一次,如果在block中引用它,block也会retain它一次。
6、__block: 表示这个变量值能在block中被修改(值修改,而不是修改对象中的某一个属性,可以理解为修改指针的指向)。会被自动retain。
被 __block 修饰的变量在块中保存的是变量的地址。(其他为变量的值)
- /* ViewController.h */
- #import <UIKit/UIKit.h>
- typedef void (^ABlock)(void); //定义一个简单的Block
- @interface ViewController : UIViewController {
- // self的属性
- NSMutableArray *_items;
- // 1、self的属性,换句话说,self持有block,即self对block具有强引用
- ABlock _block;
- }
- @end
- /* ViewController.m */
- #import "ViewController.h"
- @implementation ViewController
- - (void)viewDidLoad
- {
- [super viewDidLoad];
- _items = [[NSMutableArray alloc] init];
- _block = ^{
- // 2、_block内部用到了self的属性_items,换句话说,_block持有了self,导致retain cycle。
- // 因为只要 block中用到了对象的属性或者函数,block就会持有该对象而不是该对象中的某个属性或者函数。
- [_items addObject:@"Hello!"];
- };
- }
- @end
Xcode在编译以上程序的时候会给出一个警告:Captureing ‘self’ strongly in this block is likely to lead to a retain cycle。
解决方法:创建一个本地变量blockSelf,指向self,然后用结构体语法访问实例变量。代码如下:
- __block ViewController *blockSelf = self;
- _block = ^{
- [blockSelf->_items addObject:@"Hello!"];
- };
这么修改之后,blockSelf是本地变量,是弱引用,因此在_block被retain的时候,并不会增加retain count,所以retain cycle就解除了,Xcode也不再出现警告了,问题解决。
- DoSomethingManager *manager = [[DoSomethingManager alloc] init];
- manager.complete = ^{
- [manager otherAction];
- [manager release];
- };
retain cycle 就这么形成了,即使调用了release,manager也不会释放,因为manager和block相互持有了。为了解除retain cycle的话,我们可以这样写:
- __block DoSomethingManager *manager = [[DoSomethingManager alloc] init];
- __weak DoSomethingManager *weakmanager = manager;
- manager.complete = ^{
- [weakmanager otherAction];
- };
iOS之Block报错:capturing 'self' strongly in this block is likely to lead to a retain cycle相关推荐
- ISE MAP报错: Unsupported programming for BSCAN block and JTAG_CHAIN attribute value 1的解决方法
ISE MAP报错: Unsupported programming for BSCAN block and JTAG_CHAIN attribute value 1的解决方法 参考文章: (1)IS ...
- 以太坊搭建,不能使用puppeth 创建初始块,报错Fatal: Failed to write genesis block: unsupported fork ordering: eip15
以太坊搭建,不能使用puppeth 创建初始块,报错Fatal: Failed to write genesis block: unsupported fork ordering: eip15 新建 ...
- Capturing 'self' strongly in this block is likely to lead to a retain cycle
技术分享 » Phone | 阅读(1629) | 评论(0) May 10 2014 _player.completionBlock = ^{ [self stopPlay] ...
- ISE MAP报错: Unsupported programming for BSCAN block and JTAG_CHAIN attribute value 1的解决方法...
2014-04-16 17:35:30 ISE MAP报错: Unsupported programming for BSCAN block and JTAG_CHAIN attribute valu ...
- ionic ios查看大图报错 the file to show is not valid image,or could not be loaded
ionic ios查看大图报错 the file to show is not valid image,or could not be loaded 解决代码如下 public showImage(u ...
- xx.xib: error: Illegal Configuration: Safe Area Layout Guide before iOS 9.0报错问题解决
之前是用xcode8.3.3创建的工程最近升级到Xcode9.0 遇见了这个问题 在Xcode 9.0以上 新建xib文件会报错 xx.xib: error: Illegal Configuratio ...
- python 报错 IndentationError: expected an indented block SyntaxError: invalid character in identifie
红色方框那里敲击一个空格就好! 输入要在全英情况下! 另外,还要注意括号的事情.括号别出错误! IndentationError: expected an indented block的报错: Syn ...
- 【错误记录】发布 Flutter 插件包报错 ( It‘s strongly recommended to include a “homepage“ or “repository“ field )
文章目录 一.报错信息 二.解决方案 一.报错信息 发布 Flutter 插件包到中央仓库前 , 先执行 flutter packages pub publish --dry-run 命令 , 检查插 ...
- Spark报错:Bad response ERROR for block BP-78092257-8.xx-121xxx
1.背景 一个spark 运行了一夜的程序突然报错 java.io.Exception : Bad response ERROR for block BP-78092257-8.xx-121xxx:b ...
- iOS模拟器运行报错Unable to install /xxx/build/ios/iphonesimulator/Runner.app
前言 最近在做项目用模拟器运行,清理缓存后发现模拟器运行不起来了,报错如下: Unable to install /xxx/build/ios/iphonesimulator/Runner.app o ...
最新文章
- HDOJ 1070 排序 水
- 百米路由器2登陆地址_女孩子也要会的无线路由器连接技巧,再也不求男生了...
- ViewPager实现页面切换
- html鼠标点击有手势出来,用原生js+css3撸的一个下拉手势事件插件
- mac os 录屏快捷键_Mac跨平台自动同步记事本
- mysql 学习笔记09字符串相关函数
- CodeForces 895 B. XK Segments 二分查找
- CocoaPods 错误 target overrides the `OTHER_LDFLAGS`...
- 经典算法排序——插入排序
- 公交/地铁出行测试点
- Samba安装详细步骤
- 疫情下跨越一万公里的友情:熊超与飒特电子哨兵的故事
- 211计算机考研到985难度,普通人想考研到985/211院校到底有多难?听听他们的心声!...
- 调研了700多家上市公司后,我们得聊聊“韧性”这件事
- 问题解决:Invalid version number:Version number may be negative or greater than 255
- Android扭曲图像(水面落叶壁纸初步实现)
- 论文中的参考文献规范
- QT窗口:透明与半透明、不规则异形窗口、控件透明与半透明、不规则异形按钮
- 不懂英语学计算机编程,不懂英语应该怎么学编程
- composer [InvalidArgumentException] Could not find package laravel/laravel with stability stable.