目标C,类,&全局变量

时间:2012-02-19 23:34:18

标签: objective-c xcode class variables global-variables

我一直在学习Objective-C,最近才开始使用类(而不是在ViewController中拥有所有内容)。我遇到了一个问题,因为我不知道如何处理我希望在其他类中可以访问的变量。

我有一个在我的“ViewController”中创建的UIView的NSArray。然后传递给我的“LayoutManager”,根据屏幕大小设置它们的帧。此阵列也需要从我的“BlockManager”和“ColorManager”访问。

在类似情况下处理此数组和其他变量的最佳方法是什么。我应该使用全局变量,如果是,如何使用?或者有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

全局变量在面向对象编程中通常是一个坏主意(单例模式可能是一个可接受的例外,尽管意见各不相同)。一般而言,您还希望避免共享原始数据并让任何人做任何他们想做的事情 - 您最终需要向每个人提供其他人的内部实施知识,并且管理起来非常困难。

在你的情况下,听起来LayoutManager是一次性任务(或者每次轮换可能一次?),所以将对象交互短语称为“这里是我的观点,请调整大小”并使对象的整个生命周期。所以你要把数组传递给init,你让这个类运行一次,然后释放它。

如果BlockManagerColorManager有需要与视图控制器进行有关其视图的通信,则应该创建合适的委托协议。然后,通信线路是他们让视图控制器知道他们应该知道的任何事情,并且它负责对阵列采取行动。

答案 1 :(得分:2)

好像你可能会遇到过度使用Singletons来管理不需要Singletons的控制器的问题。这可能很有用:

我最近将我的整个程序从单例重写为在需要时传递对象。请注意,单例和共享全局对象不相同,Apple自己的类使用sharedObjectdefaultObject实例化并返回共享实例,但没有任何东西阻止您实际为您创建该类的另一个实例自己的需要。

另一方面,Singleton将对象限制为单个实例,这意味着放弃具有两个实例(将来可能需要)的能力,以便从任何地方完全访问。从这个意义上说,您实际上只需要总访问部分而不是单个实例的限制,因此您可以考虑sharedObject模式。这是一个例子:

// Up the top in the .m file
static MySharedClass *sharedInstance;

// A class method to return the shared instance
+ (MySharedClass *)sharedInstance {
    if (!sharedInstance) {
        sharedInstance = [[MySharedClass alloc] init];
    }
    return sharedInstance;
}

话虽如此,我会考虑将程序结构化为在需要时传递对象,而不是全局设置所有内容以供所有内容访问。否则,您使用过度使用单例/全局对象编写的代码更加耦合,无法从当前项目中拉出并在其他地方使用,并且由于您需要考虑这些管理器类的全局状态,因此调试更加困难。

我将创建我的主控制器(ViewController),然后实例化所需的其他控制器类并在它们之间传递资源。您提到的UIViews的NSArray将根据需要存储在链中的高位,可能在顶部。然后,此Presenter将创建LayoutManager并将所需对象传递给它以进行进一步的工作。同样,我会将这些对象传递给BlockManager和ColorManager。