【问题标题】:Initialized variable: 'self' captured by a closure before all members were initialized初始化变量:在所有成员初始化之前由闭包捕获的“自我”
【发布时间】:2017-06-15 07:01:43
【问题描述】:

我在初始化自定义类时遇到问题。当类初始化更新属性时,我需要在一些数据上设置一个观察者。最初,属性可以为空,这就是我在启动时设置它们的方式。但是,Xcode 仍然会抛出“在所有成员初始化之前由闭包捕获的'self'”错误。这是代码的简化版本。

class Foo {
    init() {
        self.usersRef = ref.child("users")
        self.usersRef.observe(DataEventType.value, with: { (snapshot) in
            // snapshot error checking
            // users is [String]

            self.users = users
        })
    }

    private var usersRef: DatabaseReference
    private(set) var users: [String] = []

}

我也试过了

class Foo {
    init() {
        self.users = [String]()
        self.usersRef = ref.child("users")
        self.usersRef.observe(DataEventType.value, with: { (snapshot) in
            // snapshot error checking
            // users is [String]

            self.users = users
        })
    }

    private var usersRef: DatabaseReference
    private(set) var users: [String]

}

确保在回调之前初始化。

From this question 似乎我只需要给属性初始值,但似乎并非如此。我宁愿在初始化后不必调用另一个函数来设置这些处理程序。

感谢您的帮助

【问题讨论】:

  • 你在哪里初始化usersRef变量?
  • @Vyacheslav 谢谢,我在问题中错过了这个问题,已修复。

标签: ios swift firebase firebase-realtime-database


【解决方案1】:

尝试使用这个块

 { [unowned self] (snapshot) in
            // snapshot error checking
            // users is [String]

            self.users = users
        })

{ [weak self] (snapshot) in
            // snapshot error checking
            // users is [String]

            self?.users = users
        })

【讨论】:

  • 我在寻找解决方案时看到了[unowned self],但我并没有完全理解它的用途。据我了解,它正在创建一个弱引用?这会产生我在错误检查中应该注意的其他可能问题吗?
  • @JustinOroz 我在使用这些包装器时没有遇到大问题
  • 谢谢,它编译得很好,而且我看不到任何由较弱的引用引起的问题,所以这很好用!我会将其标记为已接受,谢谢。
  • 基本上,一个强大的 self 会添加到保留计数中,因此它会在存在时始终指向自身,从而创建一个保留循环。这就是为什么你想要(ed)一个弱参考
猜你喜欢
  • 2018-01-18
  • 1970-01-01
  • 2020-05-31
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
相关资源
最近更新 更多