gpt4 book ai didi

ios - NSNotification Observer Closure 在 Observer 被移除时没有被移除?

转载 作者:可可西里 更新时间:2023-10-31 23:59:13 25 4
gpt4 key购买 nike

我在 View Controller 中有以下代码来注册我的自定义通知之一。到目前为止,我一直使用选择器进行注册,但我想我会尝试使用闭包,但发现有些奇怪。

NSNotificationCenter.defaultCenter().addObserver(self, selector: "notificationReceived:", name: "NotificationKey", object: nil)
NSNotificationCenter.defaultCenter().addObserverForName("NotificationKey", object: nil, queue: nil) { [weak self] notification in
NSLog("Notification received in closure!")
}

@objc private func notificationReceived(notification: NSNotification) {
NSLog("Notification received!")
}

然后我将 View Controller 作为观察者移除。

NSNotificationCenter.defaultCenter().removeObserver(self)

移除观察者后,我仍然在闭包中看到 NSLog,但在选择器函数中看不到 NSLog。通知中心似乎正在关闭。我还注意到,如果在闭包中引用了 self,闭包可能会导致保留周期(添加 [weak self] 可以修复此问题,但仍会调用 NSLog 行)。

有谁知道为什么闭包还在处理通知?

会不会出现在选择器上使用闭包的情况(我更喜欢它们,因为它避免了魔术字符串)?

最佳答案

addObserverForName(_:object:queue:usingBlock:) 实际上返回一个您可以持有的对象。您应该将此对象传递给 removeObserver()

var observer: AnyObject?

// ...

observer = NSNotificationCenter.defaultCenter().addObserverForName("NotificationKey", object: nil, queue: nil) { [weak self] notification in
NSLog("Notification received in closure!")
}

// ...

if let observer = observer {
NSNotificationCenter.defaultCenter().removeObserver(observer)
}

关于ios - NSNotification Observer Closure 在 Observer 被移除时没有被移除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32262742/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com