[UIApplication sharedApplication] .delegate的强制转换

时间:2013-09-12 18:34:41

标签: ios casting delegates

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

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

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

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

感谢。

1 个答案:

答案 0 :(得分:1)

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

当我第一次在iOS上开始时,我曾经使用app delegate来保存全局数据和方法。

但是,这会使用应用专用代码填充您的应用代理。

我最近离开了这种方法,并且使用了数据容器单例(也许也是一个单例实用工具。)正如单例一样,我定义了一个允许我获取单例的类方法。我根据需要向我的单例添加属性来存储数据,然后使用类方法获取指向单例的指针。我把我的类方法编写为延迟加载单例。

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