2016-06-12 48 views
0

我正在用一個小的Swift應用程序玩轉。用戶可以通過點擊應用程序菜單中的「新建」來創建任意數量的實例。Swift:addObserverForName的usingBlock中可能的removeObserver循環引用

應用程序委託包含鍵入爲MainWindowController的數組。爲了從主窗口控制器陣列中刪除控制器,將監視窗口的NSWindowWillCloseNotification的

現在的問題是,如果觀察者的去除是做正確 - 我擔心有可能是一個循環參考觀察者,但我不知道如何測試爲:

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) 
    } 

} 

回答

0

一般而言,您應該始終指定self在註冊爲NSNotificationCenter的塊中爲無主。這將使該區塊不能強烈參考self。您可以使用封閉參數列表前面的捕獲列表來執行此操作:

{ [unowned self] (_) in 
    // Block content 
} 
+0

謝謝您的關注。我的問題實際上是如何測試是否有循環參考,但我必須說我的措辭不夠具體 - 我的不好。 我在_notificationCenter.debugDescription_中用_NSWindowWillCloseNotification_過濾掉了行,我找到了一種方法來測試它。 – Eliott