2016-03-24 19 views
1

クラスがあり、クラスがあり、そのクラスにはCustomViewController(UIViewControllerを継承しています)のプロパティがあり、このプロパティのゲッターにはselfが格納されています。これを説明するのに最適な方法はコード経由です計算されたプロパティで保持サイクルが可能か?

class SomeClass: { 

    var alertViewController: UIViewController? { 
     if self.wasRequested { 
      return self.chatController 
     } else { 
      let vc = CutomVC(nibName: "SomeNibName", bundle: nil) 
      vc.alert = self 
      return vc 
     } 
    } 
} 

これで、このビューコントローラを提示するとこれは削除されますか?これは維持サイクルですか? vc変数の割り当てが解除されるたびに

+0

'self'はそのメソッドの結果をまったく保存しませんか?別名、その計算されたCustomVCへの参照を持っています、もしそれが保持サイクルとは思わないのであれば。おそらく 'vc.alert'を弱い参照にするのは痛いでしょう。 – Fonix

+0

' vc.alert'はおそらく強力な参照として残すべきです。このメソッドの結果が別のビューコントローラで表示された場合、 'vc.alert'は' self'がそれ以外の場所に強く保持されていないときはゼロになります。この全体は、奇妙なデザインパターンのように思えます。 –

+0

はい、それは実際には変です:)しかし、私は何が起こるか気になりました。ありがとうございました – beretis

答えて

0

Selfありがとう、それが強く他の場所で参照されていないと仮定すると、割り当て解除されます。 selfvcを強く参照していないため、これは保持サイクルではありません。

selfは(そうでなければ提示などにより)子ビュー・コントローラとしてselfvcを追加した場合しかし、vcへの強い参照を保持することになります。これは技術的には保持サイクルですが、親ビューコントローラからselfが削除されるたびに、selfはそれ自身の子ビューコントローラへのすべての参照を削除するため、無関係です。これにより、保持サイクルはselfvcの間で解除されます。

+0

collectionViewデータソースは、例えば書籍(タイトル、著者、画像)を表示するCollectionViewコントローラを想像してみてください。このクラスのAlertには、その計算されたプロパティalertViewControllerがあり、これはdidSelectに表示されます。これは起こっていることです...その計算されたプロパティは、次にNavStackにあり、次に混乱し興味があります。 – beretis

+0

アラートの配列が、各アラートが保持しているのと同じビューコントローラによって保持されていた場合、これは保持サイクルになります。アラートの配列が逆参照されないため、各ビューコントローラがスーパービューコントローラから削除されても、保持サイクルが発生します –

+0

[Book]のリスト... ....混乱して申し訳ありません – beretis

関連する問題