2017-09-15 5 views
0

faible Pour utiliser la fermeture dans l'argumentation de UIBarButtonItem J'utilise une sous-classe:Utiliser fermeture argument sélecteur place pour UIBarButtonItem mais sans utiliser l'auto

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

mais maintenant je dois faible [weak self]:

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

Y at-il un moyen d'utiliser encore la fermeture comme sélecteur, mais ne pas enregistrer la fermeture pour éviter d'utiliser soi faible partout et vous pouvez l'oublier quelque part?

+3

Si vous ne sauvegardez pas la fermeture, comment peut-elle être exécutée plus tard, lorsque le bouton est enfoncé? –

+1

Juste un sidenote: ce que vous appelez weakSelf dans le garde let est en fait un moi fort déjà :) –

+0

@MartinR donc pas moyen d'utiliser la fermeture sans utiliser de soi faible que sur ce https://stackoverflow.com/a/44037534/1836115 – iOSGeek

Répondre

1

En un mot, non.

Vous devez enregistrer la fermeture si vous appelez plus tard. Si vous enregistrez une fermeture et que cette fermeture fait référence à self, vous devez faire self partie d'une liste de capture pour éviter un cycle de conservation. C'est ce que les listes de capture sont pour, et est le modèle de codage correct pour cette situation. Chaque fois que vous faites référence à soi dans une fermeture, vous devez vous arrêter et réfléchir sur les cycles de retenue.