Objective c MVC:将模型指针传递到视图?

Objective c MVC:将模型指针传递到视图?,objective-c,model-view-controller,Objective C,Model View Controller,我有一个iOS应用程序正在运行,我正在尝试清理一些代码结构和实现。我想澄清我对MVC的理解并改进我的代码 问题:将模型传递给UIView以便视图可以基于模型元素的状态进行渲染是否合法 我在下面概述了一个示例,但意识到它可能不清晰,太乏味,无法阅读,等等。要点是:如果UIView没有更改模型中的任何值,它保留对模型的弱引用是否可以?(例如,与总是要求其委托返回指向模型的临时指针相比) --谢谢你的评论 示例:想象一个UIView,它代表一座10层楼高的建筑,每层楼有一扇窗户。该模型是一个包含10个

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

问题:将模型传递给UIView以便视图可以基于模型元素的状态进行渲染是否合法

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

--谢谢你的评论

示例:想象一个UIView,它代表一座10层楼高的建筑,每层楼有一扇窗户。该模型是一个包含10个自定义窗口对象实例的NSArray。每个窗口都有一个obj。具有一个状态(灯光打开或关闭)和一个CGRect,表示窗在整个建筑视图rect中的位置

建筑实例的控制器定义建筑视图(其框架)和所有窗口对象的大小,包括CGRECT、状态等,从而创建NSArray模型。然后,我将此模型指定给建筑控制器的UIView(但retain是建筑控制器的强属性)

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


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

最佳选择取决于相关对象的生存期

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

如果您的控制器不拥有模型对象(这在具有许多不同协同控制器对象的应用程序中很容易发生),则您有两个选项:

  • 保留对NSArray的强烈引用
  • 保留NSArray对象的副本(可能是深度副本),NSView对象将根据需要使用该副本

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

    您走的是正确的道路。但该观点没有理由对该模型进行“弱”引用。它应该对实际显示的模型片段具有强引用,除非您希望模型片段数据能够在显示时消失。那将是不寻常的

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

    错误的是
    窗口窗格查看
    建筑
    发出请求以获取正确的窗口信息。管制员应与
    大楼
    对话,分配信息,并将每个
    窗口交给相应的
    窗口查看


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

    谢谢!我想我明白你的意思。我对您评论中的
    弱(或赋值)
    vs
    引用感到有点困惑,因为
    BuildingViewController
    及其视图将共享相同的生命周期(根据我的设计)。也许这并不重要,因为那?哦-我的模型不知道视图,但我想知道如何在模型中存储CGRect数据-我可以在模型中为CGRect数据创建一个并行数组,但视图还需要知道模型状态才能正确绘制,因此将其打包似乎是有意义的。CGRect只是数据。它表示有关绘图的信息。它不会自己画。管理CGRect数据的模型没有问题。好的,谢谢。我想我当时就知道了。我的控制器、它的视图和模型将永远共存或共存。正如我在下面提到的,我只是想知道在模型中存储CGRect数据是否开始用太多视图特定的东西“污染”它。但它是静态的——一旦创建就不会改变,并且是通用的——每个“建筑”将具有相同的CGRECT集。