-2

最近我一直在查看我的代码,并注意到在我的一个视图控制器中,没有调用 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()/ 的任何建议

谢谢!!

4

1 回答 1

0

您的闭包正在捕获对 的强引用self,这会阻止您的对象被释放;你有一个保留周期。当您不在self闭包中引用时,您可以避免这个循环,这就是为什么您的视图控制器在您只有print语句时被释放的原因。

您可以[weak self]在闭包中使用来防止这种情况;然后,您需要在使用之前在闭包中解开 self 。

NotificationCenter.default.addObserver(forName: .UIKeyboardWillShow, object: nil, queue: nil) 
{ [weak self] notification in 
    self?.keyboardWillShow(notification: notification)
}

于 2021-04-18T21:23:49.870 回答