2017-09-15 36 views
0

爲了使用封閉的說法UIBarButtonItem我使用一個子類:使用封閉,而不是選擇論據的UIBarButtonItem,但沒有使用弱自我

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

,但現在我需要弱[weak self]

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

有沒有辦法仍然使用閉包作爲選擇器,但不保存閉包,以避免在任何地方使用弱自我,你可能會忘記它的地方?

+3

如果你沒有保存閉包,那麼當按下按鈕後怎麼才能執行呢? –

+1

只是一個旁註:你所謂的weakSelf在後衛讓實際上是一個強大的自己已經:) –

+0

@MartinR所以沒有辦法使用閉包,而不使用弱自我這個怎麼樣https://stackoverflow.com/a/44037534/1836115 – iOSGeek

回答

1

總之,沒有。

如果您打算稍後調用它,則必須保存閉包。如果您要保存一個閉包,並且該閉包涉及self,則應該使self成爲捕獲列表的一部分,以避免保留週期。這就是捕獲列表的作用,並且是這種情況的正確編碼模式。

無論何時你在閉包中引用self,都需要停下來思考保留週期。

相關問題