gpt4 book ai didi

ios - 如果他们引用的对象被释放,守卫是否可以在使用 [weak self] 的闭包中让 `self` = self 导致崩溃?

转载 作者:行者123 更新时间:2023-12-05 04:27:49 28 4
gpt4 key购买 nike

我查看了关于堆栈溢出的一些关于使用[weak self]和[unowned self]的问题的评论。我需要确保我理解正确。

我正在使用最新的 Xcode - Xcode 13.4,最新的 macOS - macOS Monterey 12.4,我正在编写与 iOS 12.0 到最新的 iOS 15 兼容的代码。

首先,我是否更正了具有强引用的内存归强引用所属的内存所有?

此外,这是我真正需要知道的,我想知道如果我在闭包的开头使用 [weak self] in 会发生什么,然后我有语句 guard let `self` = self else { return } .我相信 guard 语句,如果条件成功,将引用 self holds 分配给在 guard 语句的 let `self 部分中新声明的名为 self 的强引用。对吗?

这让我想问的是,闭包结束时会发生什么。我是否正确,即使较新的 self 持有强引用,一旦闭包中的代码执行了闭包中的最后一条语句,强引用指向的内存就会被释放,因为具有强引用的较新 self 是在闭包本身,并与为该闭包分配的所有内存一起被释放。

我想我做对了所有这些。如果没有,请告诉我。

如果您愿意,我对任何其他信息或任何说明感兴趣。

最佳答案

当你像这样写一个闭包时:

{ [weak self] in
guard let self = self else { return }
...
}

您正在检查声明此闭包的类是否仍处于分配状态,如果该类仍处于分配状态,您将在闭包本身内部创建一个新的强引用。

你这样做是因为如果所有其他对该类的强引用都被删除,仍然会在中创建强引用

guard let self = self else { return }

此时您可以确定在闭包结束之前分配声明闭包的类,因为引用在闭包本身中。

所以,要回答你的问题,不,如果你写

guard let self = self else { return }

那个闭包不会崩溃,因为你有一个仍然存在的强引用。

不同的是如果你使用 [unowned self]。 Unowned self 就像一个未包装的可选对象。如果你在不检查它是否存在的情况下使用它,你就是在隐式地写

self!.<something>

因此,如果在您调用该闭包时释放了 self,它将崩溃。

关于ios - 如果他们引用的对象被释放,守卫是否可以在使用 [weak self] 的闭包中让 `self` = self 导致崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72768073/

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