2016-08-23 27 views
5

如果我的viewcontroller必須使用委託進行初始化,那麼使用無主的代碼是否存在任何危險?非可選代表的弱vs無主

使用弱似乎引入了函數失敗的概率(見下文),儘管它不會崩潰。

無論如何,在這種情況下使用非持有人會不安全嗎?

class MyViewController: UIViewController 
    private weak var delegate: MyViewControllerDelegate? 
    init(delegate: MyViewControllerDelegat) { 
    self.delegate = delegate 
    } 
    func foobar { 
    delegate?? 
    } 

相比

class MyViewController: UIViewController 
    private unowned var delegate: MyViewControllerDelegate 
    init(delegate: MyViewControllerDelegate) { 
    self.delegate = delegate 
    } 
    func foobar { 
    delegate.doAction() 
    } 

回答

2

如果控制器必須與委託進行初始化和控制器不能工作,沒有它那麼unowned是正確的解決方案。但是,您必須確保在您的控制器被釋放之前,委託永遠不會被釋放。 通常,委託人應該是您的控制器的所有者。

然而,使用weak並不複雜或者:

delegate?.doAction() 
2

Apple Documentation

使用弱引用時,它是有效的,提及成爲其一生中的某個時刻 零。相反,如果您知道在初始化過程中已經設置 ,那麼該引用永遠不會爲零,請使用無主 引用。

因此,在您的情況下,如果您知道委託人在整個有生之年都會在場,請使用unowned

weakunowned之間的區別是,弱可以是零和無主不能爲零。兩者都不會添加到保留週期,只要您不取消分配代理,就不會有unowned的危險。