添加到从" Object"创建的界面构建器场景中的对象。模板可以在视图控制器上具有标记为弱和强的引用插座。我们最近观察到一种行为,即“对象”的出口。标记为弱的将在创建视图控制器并通过viewDidLoad()和viewDidAppear(_ :)调用后保留其值。这只意味着一件事:对象被保留,因为它在其他地方被强烈引用。
谁引用"对象"宾语?如何在没有@IBOutlet的情况下获取对它的引用?
答案 0 :(得分:0)
将Button
从object library
拖到Storyboard's
场景上时,在运行时实例化该场景时,将创建与该按钮关联的object
。为了与该对象进行交互,您只需在ViewController中对该对象进行weak
引用即可。
答案 1 :(得分:0)
因此,我尝试通过在Interface Builder中添加NSObject
" Object"来复制您所要求的内容。 (基于您在评论中引用的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
的私有财产,它强烈引用"对象"。
此参考仅在视图控制器离开堆时清除。
回答您的第二个问题,因为_topLevelObjectsToKeepAliveFromStoryboard
是私有财产,您将无法从UIViewController
子类中访问它。
在这里,您必须使用IBOutlet
来获取对该"对象"的引用。此外,关于天气IBOutlet
应为weak
或strong
存在很多争论,但这取决于您。