【问题标题】:Objective C, Classes, & Global VariablesObjective C、类和全局变量
【发布时间】:2012-02-19 23:34:17
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    在您的情况下,听起来LayoutManager 是一次性任务(或者可能每次旋转一次?),因此可以将对象交互表述为“这是我的观点,请调整它们的大小”并使其成为对象的整个生命周期。因此,您可以将数组传递给 init,让该类运行一次然后释放它。

    如果BlockManagerColorManager 需要与视图控制器就其视图进行通信,那么您可能应该创建合适的委托协议。然后沟通的路线是他们让视图控制器知道他们计算出的任何内容,它应该知道并负责对数组采取行动。

    【讨论】:

    • 我没有想过在这个意义上使用委托并将数组留给视图控制器。我会试试看。我猜应该管理视图中所有内容的类是 ViewController,所以从逻辑上讲这确实有意义。
    【解决方案2】:

    您似乎遇到了过度使用单例来管理不需要单例的控制器的问题。这可能有用:

    我最近重新设计了我的整个程序,从单例到传递需要的对象。请注意,单例和共享全局对象并不相同,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),然后实例化所需的其他控制器类并在它们之间传递资源。您提到的这个 UIView 的 NSArray 将根据需要存储在链中的最高位置,大概就在顶部。然后,此 Presenter 将创建 LayoutManager 并将所需的对象传递给它以进行进一步的工作。同样,我会将这些对象传递给 BlockManager 和 ColorManager。

    【讨论】:

      猜你喜欢
      • 2012-01-07
      • 1970-01-01
      • 2011-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多