[UIApplication sharedApplication].delegate 的铸造

Posted

技术标签:

【中文标题】[UIApplication sharedApplication].delegate 的铸造【英文标题】:Casting of [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 中声明的自定义委托协议。)

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

谢谢。

【问题讨论】:

【参考方案1】:

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

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

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

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

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

【讨论】:

以上是关于[UIApplication sharedApplication].delegate 的铸造的主要内容,如果未能解决你的问题,请参考以下文章

WatchKit 中 UIApplication.sharedApplication().delegate 的等价物是啥?

XCTest:[UIApplication sharedApplication] 返回 nil

iOS UIApplication sharedapplication用法

[UIApplication sharedApplication].keyWindow.rootViewController

iOS [[UIApplication sharedApplication] delegate]运用

获取外部 [UIApplication sharedApplication]?