2016-08-23 9 views
5

私のviewcontrollerを代理人で初期化する必要がある場合は、代わりに無所有者を使用することに危険がありますか?非オプション代理人のために弱いvs無用

weakを使用すると、関数が失敗する可能性があります(下記参照)。ただし、クラッシュすることはありません。

この場合unownedを使用すると、とにかく危険ですか?お使いのコントローラデリゲートで初期化されなければならないと、コントローラは、その後unownedが正解であるそれなしで動作することはできません場合は

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

答えて

2

に比べ

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

。ただし、コントローラの割り当てを解除する前にデリゲートの割り当てが解除されないようにする必要があります。 通常、代理人はコントローラの所有者である必要があります。

delegate?.doAction() 
2

Apple Documentationは、それが有効であるときはいつでも参照がその一生の間にいくつかの時点で ゼロになるのを

が弱い参照を使用して書かれています:

しかし、weakを使用すると、どちらかの複雑ではありません。逆に、初期化中に が設定されていれば、参照がゼロにならないことがわかっている場合は、無償の 参照を使用してください。

あなたのケースでは、代議員が生涯にわたって存在することがわかっている場合はunownedを使用してください。

weakunownedの違いは、弱い場合は無限になり、無所有の場合は無限にすることができないということです。両方とも保持サイクルに追加されず、デリゲートの割り当てを解除しない限り、unownedには危険はありません。

関連する問題