2016-06-12 5 views
0

Ich bin mit einer kleinen Swift-Anwendung herumspielen. Darin kann der Benutzer beliebig viele MainWindow Instanzen erstellen, indem er im Menü der Anwendung auf "Neu" klickt.Swift: mögliche RemoveObserver zyklische Referenz in addObserverForName usingBlock

Der Anwendungsdelegate enthält ein Array, das in MainWindowController eingegeben wurde. Die Fenster werden für die NSWindowWillCloseNotification überwacht, um den Controller aus dem MainWindowController Array zu entfernen.

Die Frage ist nun, ob die Entfernung des Betrachters richtig gemacht - ich fürchte, es könnte, aber ich weiß nicht, wie zu testen, dass ein zyklischer Bezug auf Beobachter sein:

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

} 

Antwort

0

Im Allgemeinen sollten Sie immer angeben, dass self nicht in Blöcken registriert ist, die unter NSNotificationCenter registriert sind. Dies wird verhindern, dass der Block einen starken Bezug auf self hat. Sie würden dies mit einer Erfassungsliste vor der Parameterliste Ihres Verschlusses machen:

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

Vielen Dank für diesen Tipp. Meine Frage war eigentlich, wie man testet, ob es eine zyklische Referenz gibt, aber ich muss sagen, ich habe es nicht spezifisch genug formuliert - mein Schlechter. Ich habe eine Möglichkeit gefunden, dies zu testen, indem Sie die Zeilen mit _NSWindowWillCloseNotification_ in _notificationCenter.debugDescription_ ausfiltern. – Eliott

Verwandte Themen