【问题标题】:Override Interface Builder instantiation of objects?覆盖对象的接口生成器实例化?
【发布时间】:2010-10-27 22:04:51
【问题描述】:

我正在为 iPhone 开发,我有一个类 DataManager,用于维护我的应用程序数据。当应用程序启动/退出时,数据会从磁盘读取/写入磁盘以创建此类的实例,使用 NSKeyedArchiver(和 Unarchiver)类,因为 DataManager 遵循 NSCoding 协议。

我遇到的一个问题是我需要 DataManager 可以被我的许多其他 IB 类访问,因此它被定义为 IB 中的一个对象,并且这些类有一个出口。 DataManager 是使用标准的 init: 方法(或者可能是 initWithCoder:?)创建的,但由于 IB 没有正确的文件(或文件中的 NSData)来实例化对象,因此它没有初始内容。

那么,有没有办法告诉 IB 自动实例化该类?这将改为使用我的应用程序委托执行,例如:

AppDelegate.h

IBOutlet DataContext *context;

AppDelegate.m

context = [NSKeyedUnarchiver unarchiveObjectWithData:dataLoadedFromFile];

如您所见,这带来了一个问题。上下文不会被实例化两次,一次由 InterfaceBuilder 实例化,然后由我的应用程序委托第二次实例化?

我想防止在委托中将上下文维护为 ivar,因为这似乎偏离了 MVC 范式,而是倾向于单例模式。 (控制器不应该对我脑海中的数据负责。它显然可以维护对它的引用,但不应该负责将它提供给其他类。)

【问题讨论】:

    标签: objective-c cocoa cocoa-touch xcode model-view-controller


    【解决方案1】:

    当应用程序启动/退出时,数据会从磁盘读取/写入磁盘以创建此类的实例,使用 NSKeyedArchiver(和 Unarchiver)类,因为 DataManager 遵循 NSCoding 协议。

    我遇到的一个问题是我需要 DataManager 可以被我的许多其他 IB 类访问,因此它被定义为 IB 中的一个对象……如您所见,这提出了一个问题。上下文不会被实例化两次,一次由 InterfaceBuilder 实例化,然后由我的应用程序委托第二次实例化?

    是的。

    首先,您应该考虑这是控制器还是模型对象。在我看来,它就像一个控制器。

    如果是,那么您应该将模型移动到一个或多个单独的对象中,并使这些对象符合 NSCoding,并让数据管理器加载和保存这些对象。此解决方案的一个好处是,您可以告诉数据管理器在收到内存不足警告时保存对象并清除它们,而不仅仅是在退出时。

    【讨论】:

      猜你喜欢
      • 2011-04-21
      • 1970-01-01
      • 1970-01-01
      • 2016-11-23
      • 1970-01-01
      • 1970-01-01
      • 2011-08-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多