2017-09-15 10 views
0

Um Schließung im Argument von UIBarButtonItem verwende ich eine Unterklasse bin mit:Verwendung Verschluss statt Selektor Argument für UIBarButtonItem aber ohne schwache Selbst mit

class ActionBarButtonItem: UIBarButtonItem { 
    private var actionHandler: (() -> Void)? 

    convenience init(title: String?, style: UIBarButtonItemStyle, actionHandler: (() -> Void)?) { 
     self.init(title: title, style: style, target: nil, action: #selector(barButtonItemPressed)) 
     self.target = self 
     self.actionHandler = actionHandler 
    } 

    convenience init(image: UIImage?, style: UIBarButtonItemStyle, actionHandler: (() -> Void)?) { 
     self.init(image: image, style: style, target: nil, action: #selector(barButtonItemPressed)) 
     self.target = self 
     self.actionHandler = actionHandler 
    } 

    @objc func barButtonItemPressed(sender: UIBarButtonItem) { 
     actionHandler?() 
    } 
} 

aber jetzt brauche ich zu schwach [weak self]:

self.add(barButton: .menu, position: .left) { [weak self] in 
     guard let strongSelf = self else {return} 
     strongSelf.openMenu() 
    } 

Gibt es eine Möglichkeit, die Schließung noch als Selektor zu verwenden, aber nicht die Schließung zu speichern, um zu vermeiden, dass du überall schwaches Selbst verwendest und du es irgendwo vergessen kannst?

+3

Wenn Sie die Schließung nicht speichern, wie kann sie später ausgeführt werden, wenn die Taste gedrückt wird? –

+1

Nur eine Nebenbemerkung: Was Sie in der Wache schwachSelf nennen, ist eigentlich ein starkes Selbst schon :) –

+0

@MartinR also keine Möglichkeit, Schließung zu verwenden, ohne schwaches Selbst zu verwenden, was ist mit diesem https://Stackoverflow.com/a/44037534/1836115 – iOSGeek

Antwort

1

In einem Wort, nein.

Sie müssen die Schließung speichern, wenn Sie später anrufen. Wenn Sie eine Schließung speichern und diese Schließung sich auf self bezieht, sollten Sie self Teil einer Erfassungsliste machen, um einen Aufbewahrungszyklus zu vermeiden. Dafür sind Capture-Listen gedacht und sind das richtige Codierungsmuster für diese Situation.

Jedes Mal, wenn Sie in einem Abschluss auf self verweisen, müssen Sie anhalten und über Retain-Zyklen nachdenken.

Verwandte Themen