Swift的function
根据文章Swift的闭包说明可以得知 Escape Block 会引起循环引用
1 | var value: (()->Void) = {} |
而Swift标榜的 Function First的函数变量,其实就是一个Escape Block 根据目前
- 官方文档的章节 Weak and Unowned References
- StackOverflow等网上讨论
并 没有解决在方法成员变量之间赋值引起循环引用的问题 ,假设存在两个Object
- 结论!!:目前2018.01.01 Swift4.0 不要瞎JB用方法成员变量,看上去很高端,还是老老实实的用delegate比较妥善
1 | class ObjectA: NSObject { |
成员变量(valParameter)和方法成员变量(funcParameter)的区别
首先实例化两个对象 A 和 B,并且将A赋值给B,让B持有一次A
1 | var a: ObjectA? = ObjectA.init() //对象A被实例化 |
成员变量(valParameter)赋值
1 | a?.valParameter = (b?.valueBParameter)! //将B的成员变量赋值给A |
根据输出可知,即使B的成员变量赋值给了A,也不会影响两者的释放
因为此时A和B共同持有 valueBParameter,A和B其自身的retain count没有增加
1 | ObjectB deinit |
方法成员变量(funcParameter)赋值
如果
1 | a?.funcParameter?() //调用A的自身的方法,输出 original object A func |
根据输出可知,因为A和B产生了Retain Circle,并没有被正确释放, 因为方法成员变量 funcParameter 本身是一个Block
Block的本质是该实例的一部分,其本身是一个方法地址,除了A和B外不会有第三个实例
1 | original object A func |