block解决循环引用(一)
来源:互联网 发布:热血江湖高手怪数据 编辑:程序博客网 时间:2024/06/04 23:03
看了网上的一些资料,感觉晕乎乎的,还不是很明白。自己抽了一个下午仔细的研究了一下block,嗯,明白了好多。分两次写出来,欢迎大家交流。
这里不讨论底层,不讨论原理,注重实用!
什么是block?
闭包(block):闭包就是获取其他函数局部变量的匿名函数。
block格式:
返回值类型(^block变量名)(形参列表) = ^(形参列表) {
};
//有参数无返回值 void (^myBlock)(NSString* ) = ^(NSString *myBlockStr){ NSLog(@"%@",myBlockStr); }; myBlock(@"safeed"); //有参数有返回值 NSString* (^myBlock1)(NSString* ) = ^(NSString *myBlockStr){ NSLog(@"%@",myBlockStr); return @"我是返回值"; }; NSLog(@"%@",myBlock1(@"参数值"));
什么情况下会造成循环引用?
当前控制器引用着block,block引用这当前控制器,就会造成循环引用。
避免循环引用详解
typedef void (^MyBlock)(NSString *myBlockStr);@interface ViewController ()@property (nonatomic,strong)MyBlock myBlock;这里声明了一个带参数不带返回值的block
//1.不会循环引用 self.myBlock = ^(NSString *myBlockStr) { NSLog(@"%@",myBlockStr); }; //self引用了myBlock,但是在myBlock并没有self什么事情,只是打印了一下参数myBlockStr,并不会造成循环引用 self.myBlock(@"myBlockStr201");
1.通过Leaks可以看到,是没有内存泄露的
//2.会循环引用 self.myBlock = ^(NSString *myBlockStr) { NSLog(@"%@",self.str); NSLog(@"%@",self.str = myBlockStr); }; //这个就是典型的block循环引用了,self引用了myBlock,myBlock内部引用了self,想要解除循环引用,需要在block外部弱引用一下self, __weak typeof(self) weakSelf = self; self.myBlock(@"myBlockStr202");
2.通过Leaks可以看到,有内存泄露
//3.解除循环引用 __weak typeof(self) weakSelf = self; self.myBlock = ^(NSString *myBlockStr) { NSLog(@"%@",weakSelf.str); NSLog(@"%@",weakSelf.str = myBlockStr); }; self.myBlock(@"myBlockStr203"); //4.block内修改外部变量 __block NSString *myStr = @"2000q"; self.myBlock = ^(NSString *myBlockStr) { myStr = @"200a"; NSLog(@"%@",myBlockStr); NSLog(@"%@",myStr); }; //Block不允许修改外部变量的值,这里所说的外部变量的值,指的是栈中指针的内存地址。__block 所起到的作用就是只要观察到该变量被 block 所持有,就将“外部变量”在栈中的内存地址放到了堆中。进而在block内部也可以修改外部变量的值 self.myBlock(@"myBlockStr204");
//5.block的简单使用升级这里在viewController里面导入一个Persopn类,里面有一个blocktypedef void (^MyBlock)(NSString * str);@property(nonatomic,strong)MyBlock myBlock;在viewController@property(nonatomic,strong)NSString *str;@property (nonatomic,strong)Person *person; self.person.myBlock = ^(NSString *str) { NSLog(@"%@",self.person.personStr); NSLog(@"%@",self.person); NSLog(@"%@",self.str); NSLog(@"%@",self.str = str); };//这种也会造成循环引用,想要解决请参照3
由于时间的原因,先写这么多,附上demo的下载地址(https://github.com/2877025939/block)。
(二)会增加反向传值,block在对象方法中的使用。
欢迎大家交流,qq:2877025939.
阅读全文
0 0
- block解决循环引用(一)
- block解决循环引用(二)
- 正确使用Block避免循环引用(一)
- ios Block解决循环引用和回传值
- 如何解决block 循环引用的问题
- __block关键字解决block的循环引用
- block解决循环引用详细解释
- iOS Block 中 循环引用的解决
- block 循环引用(2)
- 详解Block: block循环引用
- block 使用小节(防止循环引用)
- 防止Block的循环引用(技巧)
- Block的循环引用
- block循环引用
- Block的循环引用
- block 防止循环引用
- block循环引用问题
- 循环引用的block
- 广义速度V与管理理论——流水线、TPS…
- 系统思考与管理理论——第五项修炼
- 负反馈理论与管理学——目标管理、组…
- 正反馈理论与管理学——马太效应、比…
- 绝对优势与比较优势的数学分析与其…
- block解决循环引用(一)
- 《战争通论》详细分析世界十大兵书…
- 《广义动量定理与系统思考——战争、…
- 《共享经济:市场设计及其应用》——…
- 经济学金字塔
- 汇率的本质
- 费雪方程式和交易量公式
- https理解
- Swiper,怎么获取当前滑块的索引值?