[英]Will this situation create a retain cycle
我的示例代码如下(只是一个示例):
[self.view touchActionWithCompeletion:^(NSSting *text){
self.label.text = text;
}];
块是方法的参数,该方法是self.view
的实例方法,然后我在块中访问self
。 如果self.view
是一个强大的属性,这种情况是否会造成保留周期? 并且self.view
强引用该块吗?
在自己测试代码以确认我提到的逻辑后,在上面添加我的评论作为答案。
我认为应该不会发生死锁(我的意思是内存泄漏,两个牢固保存的对象相互保持引用,并且永远不会取消分配,因此我提到了死锁)仅当您将对象的强引用传递给块时才会发生(在这种情况下为self),然后传递的对象(直接或间接)拥有强烈的对自身的引用。
希望方法touchActionWithCompeletion
将不会使用强引用保存传递给它的块,这不应导致保留周期
编辑:
测试您的代码,并按预期调用deinit。 这是我尝试过的
class MyView : UIView {
func touchActionWithCompeletion(block :(NSString)->()) {
block("abcd");
}
}
class ThirdViewController: UIViewController {
var myViewInstance = MyView()
@IBOutlet var c: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
self.myViewInstance.touchActionWithCompeletion { (abcd) in
self.c.text = abcd as String
}
}
deinit {
print("deinit called")
}
}
如预期的那样,deinit调用了。
唯一需要注意的是,方法touchActionWithCompeletion
不会存储具有强引用的传递给它的块。 它只是执行它。 因此,我的上述回答在这种情况下适用。
编辑2 :(澄清我的回答)
我碰巧提到传递的对象(直接或间接地)对阻止自身有很强的引用,我想我需要解释为什么我间接提到了。
考虑这种情况,如果View对传递给它的方法的块拥有强大的引用,则会发生死锁。 尽管此处传递给块的强对象是self
并且self
不直接持有对块的引用,但如果View
持有对块的强引用,则仍然会导致死锁。
原因自我 -拥有强大的参考-> 视图 -拥有强大的参考-> 区块 -拥有强大的参考-> 自我
因此陷入僵局。 尽管self
不直接持有该块,但由于它间接持有该块,因此不会调用deinit
上的deinit
。 因此,我碰巧提到了传递的对象(直接或间接)拥有强大的引用来阻止自身
希望能帮助到你
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.