ios - 保留在一个圆圈中设置的3个变量之间的循环?

标签 ios swift

在我的应用程序中,我有一组这样连接的类 ->

class1.delegate = class2
class2.delegate = class3
class3.delegate = class1

这会导致保留周期吗?委托(delegate)是类遵循的协议(protocol)。

var delegate: protocol!

class1 也符合 UIViewController

似乎当我没有将 class2 分配为 delegate(注释掉 class1.delegate = class2)时, class1 弹出时可以deinit。当我注释掉执行 class1.delegate.func() 的行时,class1 在弹出时仍然无法 deinit

1这是内存图中某个类的部分图片。它们看起来都像这样。

最佳答案

是的,这会造成强引用循环。不管循环中涉及多少对象,它仍然是一个循环。

在调试器中运行应用程序并单击“调试内存图”按钮,enter image description here ,你会直观地看到强引用循环:

enter image description here

不仅要注意主面板中的循环引用集,还要注意左侧导航面板中的感叹号。

要解决这个问题,您的delegate 引用应该是weak:

weak var delegate: FooDelegate?

而且,仅供引用,如果您这样做,您可能希望将协议(protocol)定义为 class-only protocol ,例如:

protocol FooDelegate: AnyObject {
    ...
}

你说:

When I comment out lines that do class1.delegate.func(), class1 still can't deinit when popped.

是的,强引用循环与您是否实际调用了任何协议(protocol)方法无关,而仅与您是否有一组循环的强引用有关。

关于ios - 保留在一个圆圈中设置的3个变量之间的循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57514718/

相关文章:

html - NSManagedDocument 中主包的相对地址

设置 UILocalNotification 然后关闭应用程序时,iOS 模拟器崩溃

SwiftUI @Binding 未在子级中更新

ios - GIF 图像到 UIImageView 在 Swift 中使用 AlamofireImage

iOS 后台模式位置更新 - 管理器在后台模式下不更新

ios - 如何在我的 monotuch 应用程序中启用 PIE/ASLR?

ios - 如何在 Swift 的表格 View 单元格中添加自定义 ImageView ?

ios - 在 for 循环中安排本地通知

swift - UseProtocolCachePolicy 隐藏 304 状态码

swift - 转到 UINavigationController 但 rootViewController 之后的子 UIViewControllers 没有导航栏 SWIFT