2012-02-19 37 views
0

我一直在学习Objective-C,最近才开始使用类(而不是在ViewController中包含所有东西)。我遇到了一个问题,因为我不知道如何处理想要在其他类中可访问的变量。Objective C,类和全局变量

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

在类似情况下处理这个数组和其他变量的最佳方法是什么?我应该使用全局变量吗?如果是这样,如何?还是有更好的方法来做到这一点?

回答

2

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

在你的情况下,听起来像LayoutManager是一次性任务(或可能每次旋转一次?),因此将该对象交互称为“这是我的视图,请调整它们大小”即对象的整个生命周期。所以你可以将数组传递给init,你可以让这个类运行一次,然后释放它。

如果BlockManagerColorManager有他们需要沟通回您的视图控制器有关其意见,你应该创建合适的委托协议。然后通信线是让视图控制器知道他们已经计算出来的信息,并且它负责对数组采取行动。

+0

我没有想到在这个意义上使用代表和离开阵列的视图控制器。我会试试看。我想这是应该管理一切的观点是的ViewController类,所以逻辑上有一定道理。 – jadengeller 2012-02-19 23:56:44

2

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

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

另一方面,单身人士将对象限制为一个实例,这意味着放弃具有两个实例(未来可能需要)的能力,以便从任何地方进行完全访问。从这个意义上说,你只需要全部访问部分而不是单个实例的限制,所以你可以考虑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; 
} 

话虽如此,我会考虑你的结构化的程序通过的对象,因为他们需要,而不是由所有接入全球设立的一切。否则,用过度使用单例/全局对象编写的代码会更加耦合,无法从当前项目中拉出并用于其他地方,并且使调试变得更加困难,因为您需要考虑这些管理器类的全局状态。

我会创造我的主控制器(视图控制器),然后将实例所需的其他控制器类和它们之间传递的资源。 UIViews的这NSArray的你提到的将被存储在作为是必要的,大概直到顶部链高。然后,此Presenter将创建LayoutManager并将所需的对象传递给它以供进一步工作。以同样的方式,我将这些对象传递给BlockManager和ColorManager。