初始化变量:在所有成员初始化之前由闭包捕获的“自我”
Posted
技术标签:
【中文标题】初始化变量:在所有成员初始化之前由闭包捕获的“自我”【英文标题】: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 谢谢,我在问题中错过了这个问题,已修复。
【参考方案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)一个弱参考以上是关于初始化变量:在所有成员初始化之前由闭包捕获的“自我”的主要内容,如果未能解决你的问题,请参考以下文章
在初始化之前由闭包捕获的变量'isVericated' - Swift