gpt4 book ai didi

ios - 这种情况是否会产生保留循环

转载 作者:行者123 更新时间:2023-12-01 17:47:01 26 4
gpt4 key购买 nike

我这样的示例代码(只是一个示例):

[self.view touchActionWithCompeletion:^(NSSting *text){
self.label.text = text;
}];

block 是方法的参数,方法是 self.view的实例方法,然后我访问 self在 block 中。如果 self.view是一个强大的属性,这种情况会产生保留循环吗?并将 self.view强引用 block ?

最佳答案

在我自己测试代码以确认我提到的逻辑之后,添加我上面的评论作为答案,

我认为它不应该,死锁(我的意思是内存泄漏,两个强持有的对象相互持有引用并且永远不会被解除分配,因此我提到了死锁)只有当你将一个对象的强引用传递给 block 时才会发生(在本例中为 self),然后传递的对象持有对 block 自身的强引用(直接或间接)。

希望那个方法touchActionWithCompeletion不会使用强引用保存传递给它的 block 这不应该导致保留周期

编辑:

测试您的代码并按预期调用 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不会使用强引用存储传递给它的 block 。它只是执行它。所以我上面的回答在这种情况下是正确的。

编辑2:(澄清我的回答)

我碰巧提到了 传递的对象持有对 block 本身的强引用(直接或间接)我想我需要解释为什么我提到了 间接 .

考虑这种情况,如果 View 持有对传递给其方法的 block 的强引用,则会发生死锁。虽然这里传递给 block 的强对象是 selfself不直接持有block的引用,如果 View仍然会导致死锁对 block 有很强的引用。

原因 本人 - 拥有强大的引用 -> 查看 - 拥有强大的引用 -> block - 拥有强大的引用 -> 本人

因此陷入僵局。虽然 self不直接持有 block ,因为它间接持有 block ,因此 deinit on self 不会被调用。因此我碰巧提到了 传递的对象持有对 block 本身的强引用(直接或间接)

希望能帮助到你

关于ios - 这种情况是否会产生保留循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48057298/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com