【Objective-C高级编程】iOS与OS X多线程和内存管理(九) Block 循环引用
来源:互联网 发布:三菱plc编程线 编辑:程序博客网 时间:2024/05/22 07:02
在Block 中使用附有 __strong 修饰符的对象类型自动变量,那么当Block从栈复制到堆时,该对象为Block 所持有。
以上MyObject 的dealloc()一定没有被调用。
ARC 有效无效的情况下,__block 说明符的影响区别很大。
这样容易引起循环引用。
typedef void (^blk_t)(void);@interface MyObject : NSObject{ blk_t blk;}@end@implementation MyObject- (id)init{ self = [super init]; blk = ^{ NSLog(@“self = %@“,self); }; return self;}@endint main(){ id o = [[MyObject alloc] init]; NSLog(@“%@“,o); return 0;}
以上MyObject 的dealloc()一定没有被调用。
因为self 持有 Block,而Block 持有self;
避免循环引用,使用 __weak 修饰符。
- (id)init{ self = [super init]; id __weak tmp = self; blk = ^{ NSLog(@“self = %@“,tmp); }; return self;}
ARC 有效无效的情况下,__block 说明符的影响区别很大。
ARC 无效时,__block 说明符被用来避免Block中的循环引用。
这是由于当 Block 从栈复制到堆时,
若 Block 使用的变量为 附有 __block 说明符的id类型或对象类型的自动变量,不会被retain;
若 Block 使用的变量为 没有 __block 说明符的id类型或对象类型的自动变量,则被retain;
0 0
- 【Objective-C高级编程】iOS与OS X多线程和内存管理(九) Block 循环引用
- 【Objective-C高级编程】iOS与OS X多线程和内存管理(三) Block语法
- 【Objective-C高级编程】iOS与OS X多线程和内存管理(四) Block的实现
- block 知识点 ---- Objective-C 高级编程 iOS 与 OS X 多线程内存管理 学习笔记
- 内存管理原理----《Objective-C高级编程:iOS与OS X多线程和内存管理》读书笔记
- 《Objective-C高级编程 iOS与OS X多线程和内存管理》学习笔记——第一章自动引用计数
- Objective-C 高级编程:iOS与OS X多线程和内存管理
- Objective-C 高级编程:iOS与OS X多线程和内存管理
- 《Objective-C高级编程:iOS与OS X多线程和内存管理》读书笔记
- 【Objective-C高级编程】iOS与OS X多线程和内存管理
- 【Objective-C高级编程】iOS与OS X多线程和内存管理(二)
- 【Objective-C高级编程】iOS与OS X多线程和内存管理(六) __block 说明符
- 《Objective-C 高级编程 iOS与OS X多线程和内存管理》 核心札记一
- 《Objective-C 高级编程 iOS与OS X多线程和内存管理》 核心札记二
- 《Objective-C 高级编程 iOS与OS X多线程和内存管理》 核心札记三
- 《Objective-C 高级编程 iOS与OS X多线程和内存管理》 核心札记一
- 《Objective-C 高级编程 iOS与OS X多线程和内存管理》 核心札记二
- 《Objective-C 高级编程 iOS与OS X多线程和内存管理》 核心札记三
- vim 配置文件语法
- 尽管凭借主持人的身份成名,张绍刚先生在内心深处却对这一角色认可度很低
- 【Objective-C高级编程】iOS与OS X多线程和内存管理(八) __block 从栈上复制到堆 截获对象 数组
- 互联网产品经理的学习计划
- 时光匆匆,已成过往
- 【Objective-C高级编程】iOS与OS X多线程和内存管理(九) Block 循环引用
- C编程点滴
- 笑话
- 如何编译ffmpeg以支持dshow设备
- 朝八晚六
- 剖析MFC六大关键技术(五六)--消息映射与命令传递
- 让你尖叫的13种思维方式
- hdu 人见人爱A^B
- linux 脚本