故事板出口的弱引用保留不明确的行为

时间:2018-02-13 12:14:01

标签: ios swift cocoa interface-builder iboutlet

添加到从" Object"创建的界面构建器场景中的对象。模板可以在视图控制器上具有标记为弱和强的引用插座。我们最近观察到一种行为,即“对象”的出口。标记为弱的将在创建视图控制器并通过viewDidLoad()和viewDidAppear(_ :)调用后保留其值。这只意味着一件事:对象被保留,因为它在其他地方被强烈引用。

谁引用"对象"宾语?如何在没有@IBOutlet的情况下获取对它的引用?

2 个答案:

答案 0 :(得分:0)

Buttonobject library拖到Storyboard's场景上时,在运行时实例化该场景时,将创建与该按钮关联的object。为了与该对象进行交互,您只需在ViewController中对该对象进行weak引用即可。

enter image description here

答案 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找出谁拥有什么。这是调试器的屏幕截图。

Memory Graph Debugger Screenshot

SettingsTableViewController是我附加"对象"在Interface Builder中。

请注意,SettingsTableViewController中没有代码引用"对象"。

正如您所看到的,UIViewController上有一个名为_topLevelObjectsToKeepAliveFromStoryboard的私有财产,它强烈引用"对象"。

此参考仅在视图控制器离开堆时清除。

回答您的第二个问题,因为_topLevelObjectsToKeepAliveFromStoryboard是私有财产,您将无法从UIViewController子类中访问它。

在这里,您必须使用IBOutlet来获取对该"对象"的引用。此外,关于天气IBOutlet应为weakstrong存在很多争论,但这取决于您。