【问题标题】:MVC: passing model pointer to a view?MVC:将模型指针传递给视图?
【发布时间】:2012-02-28 01:45:44
【问题描述】:

我有一个正在运行的 iOS 应用程序,并且正在尝试清理一些代码结构和实现。我想澄清我对 MVC 的理解并改进我的代码。

问题:将模型传递给 UIView 以便视图可以根据模型元素的状态呈现它是否合法?

我在下面概述了一个示例,但我意识到它可能不清楚,阅读起来太乏味等。要点是:如果 UIView 不更改模型中的任何值,它是否可以保留对该模型? (比方说总是要求其委托返回一个指向模型的临时指针)。

--感谢任何 cmets!

示例:想象一个 UIView,它代表一个 10 层楼的 BUILDING,每层楼有 1 个窗口。这个模型是一个包含 10 个自定义 WINDOW 对象实例的 NSArray。每个窗口 obj。有一个状态(灯打开或关闭)和一个 CGRect 表示窗口在整个建筑视图矩形内的位置。

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

UIView 需要知道 WINDOW 和 CGRect 的状态才能在drawRect 中绘制视图。

我想我可以单独存储 CGRect,因为它们不是抽象数据,但将它们全部打包到一个对象数组中似乎更容易。

【问题讨论】:

    标签: objective-c model-view-controller


    【解决方案1】:

    你在正确的轨道上。但是视图没有理由对模型有“弱”的引用。对它实际显示的模型片段具有强引用是合适的,除非您希望该片段模型数据能够在显示时消失。那将是不寻常的。

    假设我有一个名为WindowPaneView 的东西,它显示WindowPane(只是避免与UIWindow 混淆)。控制器创建视图并为其提供对WindowPane 的强引用没有任何问题。在很多情况下,这是一个非常好的设计。

    错误是WindowPaneViewBuilding 发出请求以获取正确的窗口信息。控制器应该与Building 交谈,分配信息,并将每个WindowPaneView 交给其正确的Window

    WindowPane 知道有关WindowPaneView 的任何信息也是错误的。模型永远不能知道视图。发生这种情况时,疯狂会迅速下降。但是视图可能肯定知道它们直接显示的模型的特定部分。没有了。

    【讨论】:

    • 谢谢!我想我明白你在说什么。我对您评论中的weak (or assign)strong 参考有点困惑,因为BuildingViewController 及其视图将共享相同的生命周期(根据我的设计)。也许正因为如此,这并不重要?哦 - 我的模型不知道视图,但我想知道如何在模型中存储 CGRect 数据 - 我可以在模型中没有一个并行数组用于 CGRect 数据,但视图也需要知道模型状态以便正确绘制,因此将它们打包在一起似乎是有意义的。
    • CGRect 只是数据。它表示有关绘图的信息。它不会自己绘制。模型管理CGRect数据没有问题。
    【解决方案2】:

    最佳选择取决于相关对象的生命周期。

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

    如果您的控制器不拥有模型对象(这很容易在具有许多不同协作控制器对象的应用中发生),那么您有两种选择:

    1. 保留对 NSArray 的强引用
    2. 保留 NSArray 对象的副本(可能是深层副本),然后 NSView 对象将根据需要使用该对象。

    一般来说,我倾向于选项 2,因为它消除了对任何长期内存管理问题的需要。

    【讨论】:

    • 好的,谢谢。我想我当时做对了。我的控制器,它的视图和模型将永远在一起或一起死。正如我在下面提到的,我只是想知道在模型中存储 CGRect 数据是否会开始用视图特定的东西“污染”它。虽然它是静态的 - 一旦创建就不会改变,并且是通用的 - 每个“建筑物”都将具有相同的 CGRect 集。
    猜你喜欢
    • 2015-10-19
    • 2015-01-28
    • 2020-04-24
    • 1970-01-01
    • 1970-01-01
    • 2014-09-14
    • 2012-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多