【问题标题】:Variables are static without being declared so, OSX iOS Apple flavor of C or Obj-C?变量是静态的,没有被声明,OSX iOS Apple 风格的 C 或 Obj-C?
【发布时间】:2012-08-17 22:26:24
【问题描述】:

我遇到了一些,至少对我来说,Apple 在鼠标处理事件中使用的例程的奇怪行为,在文档中他们以静态方式使用变量,而不是这样声明,这是前一段时间,但是如果你以 GLKit-lib 为例,它们表现出相同的行为,例如类似于以下内容:

GLKVector3 GLKVector3Set(float x, float y, float z)
{
    GLKVector3 v = { x, y, z };
    return v;
}

在正常情况下,函数内声明的所有变量都放在堆栈上,并在函数返回调用时消失...

鼠标输入的情况与此类似:

(void) mouseInput:(mouseEvent *)event
{
   BOOL hasClicked = NO;
   //
    if(hasClicked)
    {
        //
    } else {
      hasClicked = YES;
    }
}

这只有在 BOOL 被声明为静态时才有意义......

如果有人知道我在说什么并且可以解释这种行为或参考 Apple 在其网站上的解释,我会很高兴。

尼尔斯

【问题讨论】:

  • 按值返回局部变量没有什么问题 - 当您尝试返回对局部变量的引用或指针时,问题就开始了。
  • 谢谢保罗,这部分很清楚。我通常不会那样传递整个结构,所以今天发生了一些启发:)

标签: objective-c ios c macos


【解决方案1】:

第一个代码示例没问题。 GLKVector3 是一个结构(实际上是一个联合),它不是静态的,它是按值返回的。它就像int 一样工作。

第二个代码示例在编写时没有意义(if 已被优化器删除,可能会给您一个警告)。但是你说是类似于的东西,所以我认为你理解错了。它与您发布的内容不同,只是您错过了某些东西并理解为那样。如果您想对其进行解释,请发布实际代码。

附录

正如你在评论中写的如何找到原始代码,我去检查了。原始代码与您的第二个示例完全不同。是这样的:

BOOL keepOn = YES;
...
while (keepOn) {
  ....
  switch (...) {
    case ...
      ...
    case ...
      ...
      keepOn = NO;
      break;
    default:
      ...
  }
}
...

这是有道理的,优化器不会删除任何内容。变量不是静态的。

【讨论】:

  • “第二个代码示例写得没有意义”,我猜你没有注意到这个问题;)但是以下是来自 Apple 文档的实际代码:
  • 搜索 Apple Docs - Cocoa 事件处理指南 >> 处理鼠标事件 >> 清单 4-5
  • 我做到了,而且我是对的。 Apple 的示例代码与您的示例代码完全不同。您使用if,Apple 使用while,而此时有代码可能会修改hasClicked 标志。这些变量完全不是静态的。并且不要表现得像静态变量。
猜你喜欢
  • 1970-01-01
  • 2011-07-08
  • 1970-01-01
  • 1970-01-01
  • 2011-04-06
  • 2013-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多