6

MVCの主な原則の1つはビューは決して自身のデータでなければなりません。この原則はWWDCセッション116で何度も繰り返されますが、なぜUIImageView(ビュー)がUIImage(モデル)となるのですか?それは上記の原則に違反しないのですか?なぜUIImageViewはUIImageを所有していますか?それはMVCの原則に違反していますか?

ここで何か誤解していますか? UIImageViewimageというプロパティを持っているというだけで、それが所有しているとは限りませんUIImage

答えて

7

という所有者のは、1つのオブジェクトが別のオブジェクトを保持していることを示すためによく使用されます。明らかに、画像を表示するビューは、必要なだけ画像を保持する必要があります。しかし、この「所有権」の概念は非常に限定されており、ビューの保管、変更、または管理に責任を負うものではありません。

+0

つまり、UIImageViewはUIImageを直接変更するべきではなく、その仕事をUIControllerに任せてください。理にかなって、ありがとう=) –

+0

UIImageViewはなぜ画像を保持する必要がありますか?それはちょうどそれが右にスクリーンに描く瞬間にそのイメージを必要としますか? –

+2

UIImageViewは、自身を再描画する必要があり、そのために必要なデータがイメージであるため、イメージへの参照が必要です。それがイメージを保持しない場合、イメージはいつでも簡単に解放され、ビューは無効なポインタ(おそらくクラッシュ)のままになります。誰かが別のイメージを使用するように指示するまで、使用しているイメージを保持します。 – Caleb

4

私の意見では、UIImageViewはUIImageを所有していませんが、明示的に参照する必要があります。 UIImageViewはイメージをインスタンス化しません。

テキストプロパティ(モデル)を持つUILabel(ビュー)についても同じ議論が可能です。

+0

UIImageへの参照が必要なのはなぜですか?通常、ビューとモデルの間に立つコントローラがあります。モデルが変更されると、コントローラに通知され、コントローラはビ​​ューに再レンダリングを指示します。しかし、ここでは、UIImageViewはそのimageプロパティが変更されたときに自動的に再レン​​ダリングします。はい、あなたがUILabelとそのテキストプロパティを分離しなければならないときは、本当に馬鹿ですが、これは理想的なMVCの説得ではありませんか? –

+0

純粋なMVCモデルでは、コントローラはビ​​ューを所有し、ビューとモデルの両方への参照を含みます。ビューはモデルへの参照を持ち、それ自体を表示する方法を知っています。コントローラは、使用するモデルインスタンスを表示することは依然として担当しています。 – picciano

+0

同意します。しかし、ビューには、ivarリスト(またはプロパティリスト)のモデルは必要ありません。 ' - (void)renderWithModel:(Model *)m;'のようなメソッドを持つことができます。モデルが正しく変更されたときにコントローラによって呼び出されますか?私はUIKitがUIImageViewにパフォーマンス上の理由からイメージプロパティを持たせるかどうかを完全に理解していますが、私の心にあるMVC理想に違反しています。 –

1

技術的には、UIImageViewはイメージを所有していません。イメージコピーへの参照を維持して効率的にレンダリングできます。 UIImageは不変であるため、コピーは元のインスタンスと同じインスタンスになります。

UILabelは同じように動作しますが、textプロパティはcopyと明示的に宣言します。

+0

mutable/immutableのポイントを持ってきてくれてありがとう:) –

関連する問題