添加到从“对象”模板创建的界面构建器场景的对象可以在 View Controller 上具有标记为弱和强的引用导出。我们最近观察到一种行为,在创建 View Controller 并经过 viewDidLoad() 和 viewDidAppear(_:) 调用后,标记为弱的“对象”的导出将保留其值。这只意味着一件事:对象被保留是因为它在别处被强引用。
谁引用了“Object”对象?如何在没有 @IBOutlet 的情况下获取对它的引用?
最佳答案
因此,我试图通过在 Interface Builder 中添加 NSObject
“对象”来复制您的要求。 (基于 this 您在评论中引用的图片)
我运行了项目,没有向 ViewController 文件添加任何代码。
令我惊讶的是,“对象”确实实例化了。
这里是我用来测试的 NSObject 子类的实现。
class TestObj: NSObject {
override init() {
super.init()
print("TestObj: init called")
}
deinit {
print("TestObj: deinit called")
}
}
接下来,我使用 Memory Graph Debugger 找出谁持有什么。这是调试器的屏幕截图。
SettingsTableViewController
是我在 Interface Builder 中附加“对象”的对象。
请记住,SettingsTableViewController
中没有引用“对象”的代码。
如您所见,UIViewController
上有一个名为 _topLevelObjectsToKeepAliveFromStoryboard
的私有(private)属性,它持有对“对象”的强引用。
只有当 View Controller 离开堆时,这个引用才会被清除。
回答你的第二个问题,因为 _topLevelObjectsToKeepAliveFromStoryboard
是一个私有(private)属性,你将无法从你的 UIViewController
子类中访问它。
在这里,您必须使用 IBOutlet
来获取对该“对象”的引用。此外,关于天气 IBOutlet
应该是 weak
还是 strong
存在很多争论,但这取决于你。
关于ios - Storyboard 导出的弱引用保留不明确的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48766617/