2012-02-09 61 views
6

一個MVC的主要原則是意見應永不自己數據。這個原則在WWDC會話116中重複了很多次。但是爲什麼UIImageView(一個視圖)擁有UIImage(模型)?這不違反上述原則嗎?爲什麼UIImageView自己的UIImage。它違反了MVC原則嗎?

還是我這裏誤會什麼了嗎?也許只是因爲UIImageView有一個image屬性並不意味着它擁有那個UIImage

回答

7

自己通常只是用來表示一個對象保留另一個。顯然,顯示圖像的視圖只要需要,就應該保留該圖像。但是,這種「所有權」的概念非常有限,並不意味着該視圖應該負責存儲,更改或以其他方式管理圖像。

+0

所以這意味着UIImageView不應該直接更改UIImage,將該作業留給UIController吧?有道理,謝謝=) – 2012-02-09 18:00:32

+0

但爲什麼UIImageView需要保留圖像?它只是需要這個形象,它自己畫屏幕的權利? – 2012-02-09 18:13:54

+2

UIImageView需要對圖像的引用,因爲它可能需要重繪自己,並且它需要做的數據就是圖像。如果它不保留圖像,那麼圖像可以隨時輕鬆解除分配,並且視圖將留下一個無效指針(可能會崩潰)。它保留了它使用的圖像,直到有人告訴它使用其他圖像。 – Caleb 2012-02-09 18:22:44

4

好問題。在我看來,UIImageView並沒有「擁有」UIImage,但它顯然需要引用它。 UIImageView不會實例化圖像。

同樣的觀點也可用於具有文本屬性(模型)一個UILabel(視圖)製成。

+0

爲什麼它需要有一個UIImage一個參考?通常情況下,視圖和模型之間會有一個控制器。當模型改變時,它會通知控制器,然後控制器會告訴視圖重新渲染。但是在這裏,當它的圖像屬性被改變時,UIImageView會自動重新渲染。是的,當你需要分離UILabel和它的文本屬性時,它確實聽起來很愚蠢,但這不是理想的MVC講道嗎? – 2012-02-09 17:47:21

+0

在純粹的MVC模型中,控制器將「擁有」幷包含對視圖和模型的引用。該視圖將對該模型提供參考,並知道如何展示自己。控制器仍然負責告訴視圖使用哪個模型實例。 – picciano 2012-02-09 17:52:59

+0

同意。但該視圖不需要在其伊娃列表(或屬性列表)中使用模型。它可以只有一個像' - (void)renderWithModel:(Model *)m;' - 的方法,當模型被改變時它將被控制器調用?我完全理解,如果UIKit讓UIImageView具有一個用於性能原因的圖像屬性(爲什麼需要一個控制器來處理這種微不足道的事情),但是它在某種程度上違反了我心目中的MVC理想。 – 2012-02-09 17:57:56

1

從技術上講,UIImageView不擁有圖像,它保留對圖像的拷貝的引用以能夠有效地呈現它。 UIImage恰好是不可變的,所以副本與原始實例相同。

UILabel表現相同,但明確聲明其text屬性爲copy

+0

感謝您提出可變/不可變的點:) – 2012-02-09 18:28:18

相關問題