- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在摆弄一个小型 Swift 应用程序。在其中,用户可以通过单击应用程序菜单中的“新建”来创建任意数量的 MainWindow 实例。
应用程序委托(delegate)保存一个类型为MainWindowController的数组。监 window 口中的 NSWindowWillCloseNotification,以便从 MainWindowController 数组中删除 Controller 。
现在的问题是,观察者的删除是否正确完成 - 我担心可能会有对观察者的循环引用,但我不知道如何测试:
class ApplicationDelegate: NSObject, NSApplicationDelegate {
private let notificationCenter = NSNotificationCenter.defaultCenter()
private var mainWindowControllers = [MainWindowController]()
func newWindow() {
let mainWindowController = MainWindowController()
let window = mainWindowController.window
var observer: AnyObject?
observer = notificationCenter.addObserverForName(NSWindowWillCloseNotification,
object: window,
queue: nil) { (_) in
// remove the controller from self.mainWindowControllers
self.mainWindowControllers = self.mainWindowControllers.filter() {
$0 !== mainWindowController
}
// remove the observer for this mainWindowController.window
self.notificationCenter.removeObserver(observer!)
}
mainWindowControllers.append(mainWindowController)
}
}
最佳答案
一般来说,您应该始终指定在 NSNotificationCenter
注册的 block 中 self
是无主的。这将防止该 block 对 self
产生强引用。您可以在闭包的参数列表前面使用捕获列表来执行此操作:
{ [unowned self] (_) in
// Block content
}
关于Swift:addObserverForName 的 usingBlock 中可能存在 removeObserver 循环引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37776568/
在启用 ARC 的 Cocoa 代码上,我尝试观察如下所示的窗口关闭事件。 ScanWindowController * c = [[ScanWindowController alloc] initW
我有以下代码在加载 View 时添加观察者。 - (void)viewDidLoad { [super viewDidLoad]; [[NSNotificationCenter def
我正在摆弄一个小型 Swift 应用程序。在其中,用户可以通过单击应用程序菜单中的“新建”来创建任意数量的 MainWindow 实例。 应用程序委托(delegate)保存一个类型为MainWind
我对为什么在以下代码中从未删除观察者感到困惑。在我的 viewDidAppear 中,我有以下内容: -(void)viewDidAppear:(BOOL)animated{ id gpsObserv
我是一名优秀的程序员,十分优秀!