2012-02-28 28 views
4

我有一个iOS应用程序工作,并试图清理一些代码结构和实现。我想澄清我对MVC的理解并改进我的代码。MVC:将模型指针传递给视图?

问题:将模型传递给UIView是合法的,因此视图可以基于模型元素的状态来渲染它?

我在下面概括了一个例子,但是认识到它可能不清楚,太乏味阅读,等等。要点是:如果一个UIView没有改变模型中的任何值,它可以保留一个弱引用模型? (比较说总是要求它的委托返回一个临时指针给模型)。

--thanks任何评论!

实施例:想象其表示与1个WINDOW每层有10层大楼一个UIView。这个MODEL是一个包含10个自定义WINDOW对象实例的NSArray。每个WINDOW obj。有一个状态(灯亮或熄灭)和一个代表整个建筑物视图内WINDOW位置的CGRect。

BUILDING实例的控制器定义了构建视图(它的框架)的大小以及所有的WINDOW对象,包括CGRects,它的状态等,创建NSArray模型。然后,我将这个MODEL分配给BUILDING控制器的UIView(但保留是BUILDING控制器的一个强大属性)。

UIView的需要了解窗口的状态和的CGRect以绘制视图drawRect

我想我可以单独存储CGRects因为它们不是抽象的数据,但它似乎更容易给它的所有装入对象的一个​​阵列。

回答

4

你在正确的轨道上。但是这个观点没有理由对这个模型有一个“弱”的参考。它适用于它有很强的参考片模式,它实际上是显示的,除非你想件模型数据,以便能够消失,而真实显示它。那很不寻常。

说我有这个东西叫WindowPaneView,显示WindowPane(只是为了避免在这里与UIWindow混淆)。控制器创建视图没有任何问题,并将其强制引用到WindowPane。在许多情况下,这是一个非常好的设计。

WindowPaneViewBuilding发出请求以获取正确的窗口信息会出什么问题。控制器先跟Building,瓜分殆尽的信息,以及手中的每个WindowPaneView其应有的Window

这也将是错误的,WindowPane了解的WindowPaneView什么。这个模型永远不会知道这些观点。发生这种情况时,疯狂迅速下降。但是观点可能肯定知道他们直接展示的模型的具体部分。只是没有更多。

+0

谢谢!我想我明白你在说什么。我对'弱有点糊涂(或指定)'VS,因为在您的评论'strong'参考'BuildingViewController'及其视图将共享相同的寿命(按我的设计)。也许这并不重要,因为这个?哦 - 我的模型不知道的意见,但我想知道存储模型的CGRect数据 - 我** **能有一个平行阵列不是模型的数据的CGRect,但认为还需要知道模型状态为了正确绘制,所以将它们包装在一起似乎是有意义的。 – 2012-02-28 04:57:53

+1

CGRect只是数据。它代表关于绘图的信息。它不吸引自己。管理CGRect数据的模型没有问题。 – 2012-02-28 13:45:19

1

最好的选择将取决于所涉及的对象的生命周期。

在您描述的示例中,您的控制器对象应保留模型和视图,然后为视图提供对模型的弱引用。然后,您的控制器负责所有的内存管理,并且可以在模型发布之前正确处理该视图。

如果控制器没有自己的模型对象(可以与许多不同的协作控制器对象的应用程序极易发生),那么你有两个选择:

  1. 保留一个强大的参考的NSArray
  2. 握住NSArray的对象,该对象的NSView然后使用只要必要的副本(可能是深拷贝)。

总的来说,我会倾向于选项2,因为它不需要任何长期的内存管理问题。

+0

OK感谢。我想我已经准备好了。我的控制者,它的观点和模型将永远生活或死在一起。正如我在下面提到的,我只是想知道,在模型中存储CGRect数据是否开始用太特定的东西来“污染”它。它是静态的 - 一旦创建不会改变,并且通用 - 每个“Building”将具有相同的一组CGRect。 – 2012-02-28 05:06:29