2016-08-24 8 views
1

夕方、私の質問は理論についていっぱいです。iOSオブジェクトまたは2つのコントローラ間のデリゲート?

私はいくつかのオブジェクト属性を追跡するために代表パターンを使用することをお勧めしアップルの開発者向けドキュメントから読んで理解していました。このようにして、オブジェクトにアクセスすることなくデリゲートにアクセスすることができます。 (私は本当にこの選択の理由を取得していない)

私もそれを定義することをお勧めし理解:protocolDelegate: class と我々はそれがいくつかの「種類を防ぐためにweak単語を使用することをお勧めしますクラス内のデリゲートを宣言しています問題のサイクルの "。 (??)

をので、私はコードで少し遊んでいた中にコントローラを変更する場合はもちろん、weak delegateをしようとしているので、私はあなたが、view controllers 2間weak delegateを渡すことはできませんことを発見しましたweakなので削除してください(少なくともこれは私が理解したものです)。

だから、私は2つのオプションの間で選択する必要があります。

  • weakキーを削除するデリゲートは「強い」を作ります。

  • 、またはそのオブジェクトをsegueに渡して、代理人をweakのままにします。

私は多くの混乱を覚えていますか? :

答えて

2

あなたのセグエです。

具体的な例を使用してこれをクリアしましょう:UIViewControllerにはUITableViewがあります。ビューコントローラは、テーブルビューへの強い参照を持っています。ビューコントローラは、テーブルビューのデリゲートとして機能するようになりました。

ここで、テーブルビューにのデリゲートへの参照が強い場合、次のような状況が発生します。ビューコントローラはテーブルビューへの強い参照を持ち、テーブルビューは強いView Controllerへの参照を戻します。したがってどちらも割り当てを解除することはできません。

このサイクルを中断するには、代理人への参照は通常です。これにより、ビューコントローラの保持カウントが最終的に0に落ち、テーブルビューが解放されます。

デリゲートを使用するクラスは、このパターンに従い、デリゲートへの参照をにする必要があります。したがって、あなたのセグを介して必要な参照を渡す必要があります。

+0

あなたはセグーにオブジェクトを渡すべきだと言っていますか? –

+1

この場合、「オブジェクト」が何を指しているのかよくわかりません。この点については、アプリのデザインについて詳しく説明していないので、アドバイスをするのは難しいです。しかし、私は 'delegate'プロパティを' weak'にすることをお勧めします。これは誰もが従うコンベンションだからです(理由は私の答えで説明されています)。 – DarkDust

+0

ありがとうございます!すべてクリア! –

1

私は、オブジェクトをsegueに渡すと思いますが、Seguesは、XcodeでStoryboardsを使用する上で非常に重要な部分です。別のタイプのseguesを別のタイプに渡すこともできますが、これは「表示」セグを使用する方法と、2つのビューコントローラをpass data betweenする方法を示しています。

seguesの例を簡単に使用できます。あなたはsentstringdestinationViewControllercurrentstringを送ることができます下の下で、またShowSegueは、あなたが参照しているサイクルがサイクルを保持呼ばれるidentifier

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "ShowSegue" { 
     if let destinationVC = segue.destinationViewController as? OtherViewController { 
      destinationVC.sentstring = currentstring 
     } 
    } 

} 
+0

ありがとう、私はすでにこの部分を知っていましたが、私の質問はセグーとデリゲートについてでしたが、本当にありがとうございます:) –

1

viewcontrollers間のナビゲーションは、ビューコントローラのstackを維持します。たとえばaVCについては

あなたは押したり、別のViewControllerを表示したときに、今aVC

なり、スタックの最上位、その後firstviewcontrollerあるbVCが、その後今statckの上部がbVCであると言います。だから、スタックは、今あなたが、その後、

aVC -> bVC -> cVC(top)を別のcVCを押し

aVC -> bVC(top)

、のように見えます。

スタックトップは常にユーザーに表示されます。

現時点では、aVCとbVCとcVCは割り当て解除ではありません。彼らは記憶に残っている。しかし、cVCをポップまたはディスプレイすると、メモリから割り当て解除され、今度はスタックのlookaの先頭が

aVC -> bVC(top)のようになります。

したがって、ビューコントローラーはポップされたり削除されたりしない限り、スタックに常駐します。したがって、デフォルトではストローク参照です。

Segueは何も言いませんが、プッシュまたはポップ動作のグラフィック表現であると言えます。

もう1つのことは、委任がweakであることです。強い場合は保持するサイクルを作成できるためです。

一般的には、代理人をrepresentativeと呼びます。

segueを使用している場合は、オブジェクトをprepareForsegueに送信し、他のすべてを管理します。

2

私はあなたの質問の最初の部分に集中します。前の回答が残りの部分をかなりうまくカバーしているからです。

次のような状況を考えます。ある種のネットワーク接続を処理するクラスがあります。このクラスは、サーバーに要求を送信して応答を取得します。このクラスの外には、リクエストをトリガーするボタンと、ユーザーにレスポンスを提示するビューを持つviewControllerがあります。

基本的に、ネットワークハンドリングクラスは、一方の手でviewController(ボタンが押されている)から何らかのメッセージを取得し、他方のビューのviewControllerを渡すことができます。したがって、2つのクラス間の双方向通信が必要です。ボタン処理されたメッセージをネットワークハンドリングクラスに渡すことはかなり明白ですが、逆の部分(レスポンスを渡す)はやや難解です。なぜなら、ネットワークハンドリングクラスはそれを誰が作成したのか、実践とメモリリーク防止)。

これは、デリゲートパターンが入ってくるポイントです。受信者について何も知らずに、関心のある人にデータを渡すことができます。レスポンスを渡すクラスは、「代理人」だけを知っていて、他のクラスは知っていません。さらに、ネットワーク処理クラスをそのまま使用して別のプロジェクトに入れることもできます。元のプロジェクトから他のクラスを知ることは想定されていないため、一部の「代理人」のみが変更されずに別のプロジェクトに組み込むことができます。

私はそれがあなたの選択の理由を得るのを助けることを願っています。

関連する問題