1

全新的 Objective-C 和 iOS 开发(来自 C 背景)。我正在使用标签栏控制器并使用多个视图编写应用程序。我想在应用程序启动时初始化一个对象,然后让该实例可用于所有视图。

目前在我的 AppDelegate.m 中,我有:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:    (NSDictionary *)launchOptions
{
    id myObject;
    myObject = [[MYObject alloc] init];

    return YES;
}

如何访问我的其他视图控制器的 myObject?

谢谢!(请原谅新手的问题)

4

3 回答 3

1

正如其他人所建议的那样,有很多选择:

单例模式:

+ (id)sharedFoo {
    static dispatch_once_t pred;
    static FooClass *cSharedInstance = nil;

    dispatch_once(&pred, ^{ cSharedInstance = [[super alloc] init]; });
    return cSharedInstance;
}

...并在整个过程中访问该对象[Foo sharedFoo]。一些开发人员回避单例类,因为当开发人员意识到越来越多的对象需要成为全局对象时,它可能不仅会创建一个“上帝类”,而且还会创建此类类的万神殿。这种冲动通常与对应用程序设计的思考不完整有关。单例思想的一种变体使用单例来保存对所有全局数据的引用,例如[MyApplicationData sharedData]……就我个人而言,我认为它比UIApplication为此目的使用 's 委托要干净一些。

依赖注入:

由于您使用的是UITabBarController设计,因此您可以在用户选择选项卡时使用依赖注入(通过UITabBarControllerDelegate诸如 的方法tabBarController:didSelectViewController:)传播对象,然后将其进一步传播到控制器层次结构中。

作为所有者的应用程序委托:

像单例类一样,这有可能创建一个具有过多职责的类。委托不仅UIApplication负责应用程序的生命周期,它还负责各种其他不相关的状态和行为。但是,这种模式在我看到的代码中被广泛使用。

于 2012-11-22T12:02:47.237 回答
0

有很多可能性。只需在任何类实现之外声明对象,就像在普通的 C 中一样。或者您可以使用单例类作为所有全局数据的存储。

于 2012-11-22T11:30:41.300 回答