Objective c 目标C、课程和课程;全局变量

Objective c 目标C、课程和课程;全局变量,objective-c,xcode,class,variables,global-variables,Objective C,Xcode,Class,Variables,Global Variables,我一直在学习Objective-C,最近才开始使用类(而不是将所有内容都放在ViewController中)。我遇到了一个问题,我不知道如何处理我希望在其他类中可以访问的变量 我有一个UIView的NSArray,它是在我的“ViewController”中创建的。然后它被传递给我的“LayoutManager”,它根据屏幕大小设置它们的帧。还需要从我的“BlockManager”和“ColorManager”访问此阵列 在类似情况下,处理此数组和其他变量的最佳方法是什么。我应该使用全局变量吗?

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

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


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

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

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


如果
BlockManager
ColorManager
需要就视图控制器的视图与视图控制器进行通信,您可能应该创建合适的代理协议。然后,沟通的渠道是,他们让视图控制器知道他们计算出的内容,它应该知道,并且负责对数组采取行动。

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

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


如果
BlockManager
ColorManager
需要就视图控制器的视图与视图控制器进行通信,您可能应该创建合适的代理协议。然后,通信线路是,他们让视图控制器知道他们计算出的内容,它应该知道,并负责对阵列采取行动。

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

我最近修改了我的整个程序,从单例到根据需要传递对象。请注意,singleton和shared global对象并不完全相同,Apple自己的类使用
sharedObject
defaultObject
实例化并返回共享实例,但没有什么能阻止您根据自己的需要实际创建该类的另一个实例

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

// 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;
}

这样说,我会考虑构造你的程序来传递它们所需要的对象,而不是设置全局上的所有东西来访问所有的东西。否则,您编写的代码过度使用SuntLoN/Global对象将更加耦合,不能从当前项目中取出并在别处使用,并且调试更困难,因为您需要考虑这些管理器类的全局状态。


我将创建我的主控制器(ViewController),然后它将实例化所需的其他控制器类,并在它们之间传递资源。您提到的UIView的NSArray将根据需要存储在链的最高层,大概就在顶部。然后,该演示者将创建LayoutManager,并将所需的对象传递给它以进行进一步的工作。同样,我会将这些对象传递给BlockManager和ColorManager。

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

我最近修改了我的整个程序,从单例到根据需要传递对象。请注意,singleton和shared global对象并不完全相同,Apple自己的类使用
sharedObject
defaultObject
实例化并返回共享实例,但没有什么能阻止您根据自己的需要实际创建该类的另一个实例

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

// 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;
}
说到这里,我会考虑把你的程序设置成通过Obje。