Skip to content

Commit eb0f57f

Browse files
committed
添加Block与对象之间的循环引用示例
1 parent 7f4b383 commit eb0f57f

File tree

1 file changed

+18
-1
lines changed

1 file changed

+18
-1
lines changed

iOS夯实:ARC时代的内存管理/#iOS夯实:ARC时代的内存管理.md

+18-1
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,25 @@ ARC提供是一个编译器的特性,帮助我们在编译的时候自动插
1919
基于引用计数的内存管理机制无法绕过的一个问题便是循环引用(retain cycle)
2020
(Python同样也采用了基于引用计数的内存管理,但是它采用了另外的机制来清除引用循环导致的内存泄露,而OC和Swift需要我们自己来处理这样的问题[^2])
2121
- 对象之间的循环引用:使用弱引用避免
22-
- block与对象之间的循环引用:使用__weak指令
22+
- block与对象之间的循环引用:
2323

24+
会导致Block与对象之间的循环引用的情况有:
25+
26+
~~~objective-c
27+
self.myBlock = ^{ self.someProperty = XXX; };
28+
~~~
29+
30+
对于这种Block与Self直接循环引用的情况,编译器会给出提示。
31+
32+
但是对于有多个对象参与的情况,编译器便无能为力了,因此涉及到block内使用到self的情况,我们需要非常谨慎。(推荐涉及到self的情况,如果自己不是非常清楚对象引用关系,统一使用解决方法处理)
33+
34+
~~~objective-c
35+
someObject.someBlock = ^{ self.someProperty = XXX; }; //还没有循环引用
36+
self.someObjectWithABlock = someObject; // 导致循环引用,且编译器不会提醒
37+
~~~
38+
39+
解决方案:
40+
2441
~~~objevtive-c
2542
__weak SomeObjectClass *weakSelf = self;
2643

0 commit comments

Comments
 (0)