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