Swift WatchKit:ReloadRootController未删除控制器(对象持续存在,我希望它被销毁)

Swift WatchKit:ReloadRootController未删除控制器(对象持续存在,我希望它被销毁),swift,watchkit,watchos-3,Swift,Watchkit,Watchos 3,我试图在WatchKit中实现一个登录方案(这里不必担心是否将用户类型的数据输入到他的手表中),这意味着在登录后,用户应该看到一个视图,该视图不允许他返回登录屏幕(不,如果没有主控制器代码,回答这样的问题并不容易。@kelin可能是对的 您是否尝试过使用内存图工具 调试导航器->调试区域分隔符->3个连接圆图标 它会给你们一个在给定时间的状态,有时会很有用 我会在登录控制器中设置一个中断(除其他可能性外)然后检查图形。如果没有看到您试图传递到上下文中的值的任何代码,我会说是您的上下文负责将某些

我试图在WatchKit中实现一个登录方案(这里不必担心是否将用户类型的数据输入到他的手表中),这意味着在登录后,用户应该看到一个视图,该视图不允许他返回登录屏幕(不,
如果没有主控制器代码,回答这样的问题并不容易。@kelin可能是对的

您是否尝试过使用内存图工具

调试导航器->调试区域分隔符->3个连接圆图标

它会给你们一个在给定时间的状态,有时会很有用


我会在登录控制器中设置一个中断(除其他可能性外)然后检查图形。

如果没有看到您试图传递到上下文中的值的任何代码,我会说是您的上下文负责将某些对象保留在内存中,而这些对象又将控制器保留在内存中。如果您看到
NSMutableDictionary,可以通过检查内存图形来确认这一点(存储)
抓住要传递的对象。-这是
上下文


一个混乱的解决方案是只为您想要保留引用的任何值创建一个可选的全局变量,并在需要时为其分配任何值,并在您想要解除分配时将其设置为nil。这非常混乱,但可以解决您的问题。

这似乎是一个相关的线程:


看起来调用
WKInterfaceController.ReloadRootPageController
会将对象保留在内存中,而不管您如何保存对它们的引用(可能是
弱的
,等等)

我认为您只是在某个地方保留了对
mainController
的引用。可能它有一个保留周期。在Swift中,这样的引用会是什么样子?如果您将某个类实例存储在一个变量中,该实例将被该变量引用。如果该变量是
strong
,则该实例将被保留。所有类es在Swift中通过引用传递。还有
无主
变量。这也发生在我身上。奇怪的是,当你进入内存调试图时,你的控制器是否由
NSMutableDictionary(存储)保存在内存中
?同样的问题。@Joey Slomowitz你找到问题了吗?我正在用一个ViewModel实例重新加载根目录。接口控制器按预期解除分配,但“上下文”没有(即视图模型)。我甚至保留了对它们的弱引用
DispatchQueue.main.async() { [weak self] in
                    WKInterfaceController.reloadRootControllers(
                        withNames: ["mainController"], contexts: [values]
                    )
                }
DispatchQueue.main.async() { [weak self] in
                    WKInterfaceController.reloadRootControllers(
                        withNames: ["loginController"], contexts: [message]
                )
}
    self?.pop()
    self?.dismiss()
    self?.popToRootController()
    self?.presentController(withName: