在我的应用程序中,我有一组这样连接的类 ->
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这是内存图中某个类的部分图片。它们看起来都像这样。
最佳答案
是的,这会造成强引用循环。不管循环中涉及多少对象,它仍然是一个循环。
在调试器中运行应用程序并单击“调试内存图”按钮, ,你会直观地看到强引用循环:
不仅要注意主面板中的循环引用集,还要注意左侧导航面板中的感叹号。
要解决这个问题,您的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'tdeinit
when popped.
是的,强引用循环与您是否实际调用了任何协议(protocol)方法无关,而仅与您是否有一组循环的强引用有关。
关于ios - 保留在一个圆圈中设置的3个变量之间的循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57514718/