繁体   English   中英

这种情况会造成保留周期吗

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM