ios - Storyboard 导出的弱引用保留不明确的行为

标签 ios swift cocoa interface-builder iboutlet

添加到从“对象”模板创建的界面构建器场景的对象可以在 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 找出谁持有什么。这是调试器的屏幕截图。

Memory Graph Debugger Screenshot

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/

相关文章:

ios - 是否可以在 iOS 应用程序中热交换 ionic 代码?

iphone - 日志调试 Objective-C 代码时使用哪些日志记录解决方案?

ios - 使用 TrailingSwipeActionsConfigurationForRowAt 删除单元格时出现一些奇怪的动画错误

swift - 如何在 macOS 上为 CLLocationManager 请求授权

iphone - sudzc 还是 wsdl2obj?

ios - 访问超出 Swift 范围的变量

ios - 如何让程序在后台运行?

ios - 获取 AFNetworking 响应的结果作为 JSON 字符串数组

c++ - 如何通过进程名称检查mac进程是否存在

objective-c - NSStringFromSize([self intercellSpacing]) 的类型不兼容?