使用静态变量会使它们面临从任何地方可修改的危险吗?(在Objective-C的上下文中)。如果是,有人可以建议在所有类中使用共享变量的最佳替代方法吗?
答案 0 :(得分:4)
在Objective-C中使用太多静态变量是不好的做法吗?
是。当然,“太多”尚未量化并且是主观的。实际上,全局/静态变量很少是一件好事 - 介绍非常方便,很难调试和消除。同样罕见的是它们是好的设计。没有他们,我发现生活会轻松得多。
使用静态变量会使它们面临从任何地方可修改的危险吗? (在Objective-C的背景下)。
取决于它们的声明位置和使用方式。如果您将引用传递给程序的另一部分,那么它们可以从“任何地方”进行修改。
示例:
如果你放置它们只有一个文件可以“看到”变量(例如,在所有包含的.m文件中),那么只有后续的实现可以使用它(除非你传递对外界的引用)。
如果在函数内部声明变量,则在每个转换中共享它,并在C / ObjC中为每个转换复制(但C ++ / ObjC ++中的规则非常不同)。
如果是,有人可以建议在所有类中使用共享变量的最佳替代方案吗?
完全避免使用全局变量。创建一个或多个类型/对象来保存此数据,然后将其实例传递给您的实现。
单身人士是中间立场,因为你有某种类型的全局变量/基于对象的抽象。单身人士仍然非常麻烦 - 他们被归类为全局变量,并在我的代码库中被禁止。
答案 1 :(得分:3)
静态变量是翻译单元的本地变量,因此变量绝对不能从任何地方修改。全局与静态密切相关,因为它们被分配在同一个存储区域,可以从任何地方修改,这是它们的主要危险。
当您需要从项目中的任何位置访问一组变量时,常见的方法是实现保存相关数据的singleton,并包含处理该数据的方法。在Objective C中实现的MVC应用程序中,模型通常通过单例模型对象访问。
我的场景涉及在.h文件和...中声明的许多静态变量。它们在.h文件中声明的特定方法中赋值。
如果在标题中声明静态,它们将彼此“断开连接”:每个翻译单元(即每个.m文件)从标题中获取自己的一组静态。这通常不是你想要的。
如果将这些变量设为全局变量,最终会得到一个普通的C,而不是一个Objective C解决方案。您应该将这些变量作为属性放在类中,并将函数实现与它们一起移动到类的方法中。然后按照上面链接的答案中的描述使类成为单例,以获得比基于全局变量的相应解决方案更容易理解的解决方案。