【问题标题】:Casting of [UIApplication sharedApplication].delegate[UIApplication sharedApplication].delegate 的铸造
【发布时间】:2013-09-12 18:34:41
【问题描述】:

我有一个测试项目可以在多个视图控制器上使用私有数据对象。 (我已经从 web 和 git-hub 下载了它)

- (ExampleAppDataObject*) theAppDataObject;
{
    id<AppDelegateProtocol> theDelegate = (id<AppDelegateProtocol>) [UIApplication sharedApplication].delegate;
    ExampleAppDataObject* theDataObject;
    theDataObject = (ExampleAppDataObject*) theDelegate.theAppDataObject;
    return theDataObject;
}

第一个问题是,theDelegate 是使用 AppDelegateProtocol 强制转换的,即使这个应用程序的 UIApplication 委托名称是 ViewControllerDataSharingAppDelegate,也没有任何警告。我无法理解为什么,也许是因为那是一个 id 类型? (AppDelegateProtocol 是他在 AppDelegate 中声明的自定义委托协议。)

其次,它在每个视图控制器上都显示了这种代码,看起来就像一个单例模式。 我不认为这不是在视图控制器之间传输数据的最佳方式。 传输对象数据类型的最佳方式是什么?

谢谢。

【问题讨论】:

    标签: ios casting delegates


    【解决方案1】:

    创建协议在某种程度上将代码与特定实现分离。您可以想象有多个应用程序,每个应用程序都使用自己的自定义类作为应用程序委托,但所有实现都符合 AppDelegateProtocol。

    当我刚开始使用 iOS 时,我经常使用应用程序委托来保存全局数据和方法。

    但是,这会用特定于应用的代码填充您的应用委托。

    我最近放弃了这种方法,并使用了数据容器单例(也许还有一个实用方法单例)。作为单例的典型方法,我定义了一个类方法,让我可以获取单例。我根据需要向我的单例添加属性以存储数据,然后只使用类方法获取指向单例的指针。我编写了我的类方法来延迟加载单例。

    通过使您的数据容器符合 NSCoding,它也很容易使您的数据容器单例持久化。然后每次你被移到后台时,只需将你的单例保存在某个地方。在应用启动时,将其读入。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-20
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 2011-03-22
      • 2014-05-28
      • 1970-01-01
      相关资源
      最近更新 更多