【Objective-C高级编程】iOS与OS X多线程和内存管理(九) Block 循环引用
2014-03-22 08:53
525 查看
在Block 中使用附有 __strong 修饰符的对象类型自动变量,那么当Block从栈复制到堆时,该对象为Block 所持有。
这样容易引起循环引用。
以上MyObject 的dealloc()一定没有被调用。
因为self 持有 Block,而Block 持有self;
避免循环引用,使用 __weak 修饰符。
ARC 有效无效的情况下,__block 说明符的影响区别很大。
ARC 无效时,__block 说明符被用来避免Block中的循环引用。
这是由于当 Block 从栈复制到堆时,
若 Block 使用的变量为 附有 __block 说明符的id类型或对象类型的自动变量,不会被retain;
若 Block 使用的变量为 没有 __block 说明符的id类型或对象类型的自动变量,则被retain;
这样容易引起循环引用。
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; } @end int 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;
相关文章推荐
- 【Objective-C高级编程】iOS与OS X多线程和内存管理(四) Block的实现
- 【Objective-C高级编程】iOS与OS X多线程和内存管理(六) __block 说明符
- 【Objective-C高级编程】iOS与OS X多线程和内存管理(七) __block 从栈上复制到堆
- 【Objective-C高级编程】iOS与OS X多线程和内存管理(八) __block 从栈上复制到堆 截获对象 数组
- 《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多线程和内存管理(五) Blocks 截获自动变量值
- 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多线程和内存管理 读书笔记(一)
- 内存管理原理----《Objective-C高级编程:iOS与OS X多线程和内存管理》读书笔记
- 《Objective-C高级编程:iOS与OS X多线程和内存管理》读后感