2012-02-09 56 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

相关问题