【问题标题】:What are the pitfalls and caveats of global variables in Objective-C?Objective-C 中全局变量的陷阱和注意事项是什么?
【发布时间】:2013-06-12 21:06:18
【问题描述】:

我正在查看的 SDK 演示应用程序具有应用程序委托和根视图控制器的全局变量。

我以前没见过这个,但是优点很明显。 重新输入的任何快捷方式

AViewController* rootVC = [[UIApplication sharedApplication]delegate] window] rootViewController];

仅仅获得根视图控制器似乎是一个巨大的帮助。

当然,任何看似巨大的优势总是伴随着同样的劣势。那么为什么我不应该总是在 AppDelegate.m 中为我的应用委托和根视图控制器创建一个全局变量呢?是否会浪费资源或损害安全性?

【问题讨论】:

  • 为什么不把根视图控制器传递给每个需要它的控制器呢?如果一切都需要,那么您的设计可能会更好。
  • 传递意义 #import 或覆盖初始化方法?我对此没有任何问题,我只是想知道为什么全局变量不是最佳设计。
  • 传递意味着一个属性。全局变量增加了交叉耦合和依赖。应用程序委托有一个目的,该目的不是让所有控制器都继续访问它。

标签: ios objective-c global-variables


【解决方案1】:

这是一种不好的做法,因为它会导致代码无法维护或难以维护。

  • 竞争条件很容易出现,因为应用程序的两个部分都尝试修改同一个全局变量,并且您必须确保自己按照特定顺序完成操作。
  • 随着值的更改,程序逻辑有时会令人困惑 应用程序的不同部分在您下方。你一直 必须考虑更改某个值会如何影响 使用该变量的所有其他内容以及它们可能处于什么状态 在里面。

  • 您仍然需要传递对全局对象的引用,或者
    参考父控制器以获取参考。这让你的 代码非常依赖,不如设计的代码那么健壮 独立并传入值。

这些观点非常笼统,但至少应该让您了解为什么大多数人更愿意避免使用全局作用域,而是采用解耦设计。

【讨论】:

    【解决方案2】:

    如果您经常通过共享应用程序委托访问您的根视图控制器,那么您最好添加一个全局变量作为快捷方式。本质上是一样的。它不会浪费资源或损害安全性。

    也就是说,我认为它会鼓励糟糕的设计。与其访问全局变量,不如只将引用传递给需要它们的控制器?或者也许可以将您的控制器与 NSNotification、委托或块回调解耦?

    这取决于您应用的需求。尝试在过度工程和良好的解耦设计之间找到界限。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-19
      • 2015-02-20
      • 2012-01-07
      • 2011-12-13
      • 1970-01-01
      • 1970-01-01
      • 2013-12-21
      • 1970-01-01
      相关资源
      最近更新 更多