为啥UIImageView拥有UIImage。它是不是违反 MVC 原则?
Posted
技术标签:
【中文标题】为啥UIImageView拥有UIImage。它是不是违反 MVC 原则?【英文标题】:Why does UIImageView own UIImage. Does it violate MVC principles?为什么UIImageView拥有UIImage。它是否违反 MVC 原则? 【发布时间】:2012-03-02 05:17:32 【问题描述】:MVC 的主要原则之一是视图应该从不拥有数据。这个原则在 WWDC Session 116 中重复了很多次。但是为什么UIImageView
(一个视图)拥有UIImage
(一个模型)呢?不违反上述原则吗?
或者我在这里误解了什么?也许仅仅因为UIImageView
有一个image
属性并不意味着它拥有那个UIImage
?
【问题讨论】:
【参考方案1】:从技术上讲,UIImageView
不拥有图像,它保留对图像的 copy 的引用,以便能够有效地渲染它。 UIImage
恰好是不可变的,因此副本与原始实例相同。
UILabel
行为相同,但将其 text
属性显式声明为 copy
。
【讨论】:
【参考方案2】:own这个词通常只是用来表示一个对象保留了另一个对象。显然,显示图像的视图应该在需要时保留该图像。但是这种“所有权”的概念非常有限,并不意味着视图应该负责存储、更改或以其他方式管理图像。
【讨论】:
所以这意味着 UIImageView 永远不应该直接更改 UIImage,将这项工作留给 UIController 对吧?有道理,谢谢=) 但是为什么UIImageView需要保留图片呢?它只是在将自己绘制到屏幕的那一刻才需要该图像,对吗? UIImageView 需要对图像的引用,因为它可能需要重绘自身,而它需要这样做的数据就是图像。如果它不保留图像,则可以随时轻松地释放图像,并且视图将留下无效指针(并且可能会崩溃)。它会保留它正在使用的图像,直到有人告诉它使用其他图像。 我想我现在明白了。谢谢=)【参考方案3】:好问题。在我看来,UIImageView 并不“拥有” UIImage,但它显然需要对其进行引用。 UIImageView 不会实例化图像。
对于具有文本属性(模型)的 UILabel(视图)也可以使用相同的参数。
【讨论】:
为什么需要一个 UIImage 的引用?通常会有一个控制器站在视图和模型之间。当模型发生变化时,它会通知控制器,然后控制器会告诉视图重新渲染。但是在这里,UIImageView 会在其 image 属性更改时自动重新渲染。是的,当你必须将 UILabel 和它的文本属性分开时,这听起来确实很愚蠢,但这不是 MVC 所宣扬的理想,不是吗? 在纯 MVC 模型中,控制器将“拥有”并包含对视图和模型的引用。视图将引用模型并知道如何显示自己。控制器仍然负责告诉视图使用哪个模型实例。 同意。但是视图在其 ivar 列表(或属性列表)中不需要模型。它可以有一个像-(void) renderWithModel:(Model *)m;
这样的方法——当模型改变时控制器会调用它吗?我完全理解 UIKit 是否出于性能原因使 UIImageView 具有图像属性(为什么需要一个控制器来处理这种琐碎的事情),但它在某种程度上违反了我心中的 MVC 理想。
可以,但是引用模型的视图并不违反 MVC 原则,至少按照大多数人的定义。 renderWithModel 类型的方法往往会导致更多的“程序化”编码。同样,它更多的是意见和理论,而不是硬性规定。
好吧,我必须承认我对 MVC 没有太多经验,因此这个菜鸟问题。您知道在其他 MVC 框架中,视图引用模型是否正常?只要视图从不直接修改那些模型就可以了?以上是关于为啥UIImageView拥有UIImage。它是不是违反 MVC 原则?的主要内容,如果未能解决你的问题,请参考以下文章
我有一个 UIImage,它是 UIImageView 中绘制的黑白图像。如何在触摸时用颜色填充线条内部?
如何保存 UIImage 或 UIImageView 的状态?
Swift 两种UIImageView写法,为啥一种显示得出?