deinit() 在这行代码执行时停止调用
deinit() ceases to call when this code line of code executes
最近我一直在检查我的代码并注意到在我的一个视图控制器中,没有调用 deinit()。
注释掉这一行后,deinit调用成功:
NotificationCenter.default.addObserver(forName: .UIKeyboardWillShow, object: nil, queue: nil)
{ notification in self.keyboardWillShow(notification: notification) }
我知道您需要删除观察者,但如果我替换
self.keyboardWillShow(notification: notification)
和
print("hello world")
deinit() 调用成功。
我的本地函数“keyboardWillShow”中的代码被注释掉了,但是函数签名是
func keyboardWillShow(notification: Notification)
关于如何改进此代码以不保留引用并正确命中 deinit()/
的任何建议
谢谢!!
您的闭包正在捕获对 self
的强引用,这会阻止您的对象被释放;你有一个保留周期。当你在闭包中不引用 self
时,你就避免了这个循环,这就是为什么当你只有 print
语句时你的视图控制器被释放的原因。
您可以在闭包中使用 [weak self]
来防止这种情况;然后你需要在使用它之前在闭包中打开 self。
NotificationCenter.default.addObserver(forName: .UIKeyboardWillShow, object: nil, queue: nil)
{ [weak self] notification in
self?.keyboardWillShow(notification: notification)
}
最近我一直在检查我的代码并注意到在我的一个视图控制器中,没有调用 deinit()。
注释掉这一行后,deinit调用成功:
NotificationCenter.default.addObserver(forName: .UIKeyboardWillShow, object: nil, queue: nil)
{ notification in self.keyboardWillShow(notification: notification) }
我知道您需要删除观察者,但如果我替换
self.keyboardWillShow(notification: notification)
和
print("hello world")
deinit() 调用成功。
我的本地函数“keyboardWillShow”中的代码被注释掉了,但是函数签名是
func keyboardWillShow(notification: Notification)
关于如何改进此代码以不保留引用并正确命中 deinit()/
的任何建议谢谢!!
您的闭包正在捕获对 self
的强引用,这会阻止您的对象被释放;你有一个保留周期。当你在闭包中不引用 self
时,你就避免了这个循环,这就是为什么当你只有 print
语句时你的视图控制器被释放的原因。
您可以在闭包中使用 [weak self]
来防止这种情况;然后你需要在使用它之前在闭包中打开 self。
NotificationCenter.default.addObserver(forName: .UIKeyboardWillShow, object: nil, queue: nil)
{ [weak self] notification in
self?.keyboardWillShow(notification: notification)
}