【问题标题】:What's the meaning of static variables in an implementation of an interface?接口实现中静态变量的含义是什么?
【发布时间】:2010-11-08 09:26:59
【问题描述】:

在接口的实现中定义静态变量时,我不太了解。在方法中,我确实了解它们与局部变量的区别,但不是直接在实现中定义时。

看看这些例子。这两者实际上有什么区别?

#include "MyClass.h"

@implementation MyClass
int myInt;
...
@end

还有:

#include "MyClass.h"

@implementation MyClass
static int myInt;
...
@end

myInt 在这两种情况下对所有方法都是可见的,如果我解释了我正确运行的测试,myInt 在这两种情况下对于类的不同实例都是同一个变量。

【问题讨论】:

标签: objective-c variables static static-variables


【解决方案1】:

该上下文中的“静态”关键字与普通 C 中的关键字相同:它将 myInt 的范围限制为当前文件。

【讨论】:

  • 另外,在@implementation 内部定义非局部变量与在外部定义没有区别。
  • 但这真的对实现文件中的定义有任何影响吗?反正它们不包括在内。
  • 假设你声明了 int Varibale;在两个不同的实现文件中。由于重复符号,您将在构建时遇到错误。
  • 这是否意味着它充当“私人”访问修饰符?
  • 没有。 C++ 中的“private”关键字只是添加了编译器强制限制谁可以访问变量或方法。 'static' 将其范围限定为它所在的文件,这是非常不同的。
【解决方案2】:

“在 C 和 Objective-C 中,静态变量是在程序的整个生命周期中分配的变量。这与自动变量相反,自动变量的生命周期存在于单个函数调用中;并且动态分配像对象这样的变量,可以在不再使用时从内存中释放。更简单地说,静态变量的值在所有函数/方法调用中都保持不变。当在函数外部声明时,静态变量对文件中的所有内容都是可见的它是声明的;当在函数或方法中声明时,它仅在该函数或方法中可见,但在调用之间保留该值。"

在这里查看完整的解释:

https://stackoverflow.com/a/4965145/951349

【讨论】:

    【解决方案3】:

    不幸的是,它会根据你使用它的位置而产生不同的效果。

    静态函数:
    默认情况下,所有函数都有一个全局范围。 static 说明符可让您将函数的范围限制为当前文件。

    静态局部变量:
    当您在局部变量上使用 static 修饰符时,函数会在调用期间“记住”它的值。例如,以下 sn-p 中的 currentCount 变量永远不会被重置,因此我们可以让 countByTwo() 为我们做记录,而不是将计数存储在 main() 内部的变量中。

    // main.m
    #import <Foundation/Foundation.h>
    
    int countByTwo() {
        static int currentCount = 0;
        currentCount += 2;
        return currentCount;
    }
    
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            NSLog(@"%d", countByTwo());    // 2
            NSLog(@"%d", countByTwo());    // 4
            NSLog(@"%d", countByTwo());    // 6
        }
        return 0;
    }
    

    静态关键字的这种使用不会影响局部变量的作用域。
    阅读有关static keyword 的更多信息。

    【讨论】:

    • 静态关键字将强制其行在整个应用程序运行时仅执行一次——无论调用次数如何!
    • 静态变量“currentCount”存储在内存的哪个位置?它不能在 countByTwo 的帧中,因为该帧在函数结束时被释放。那么它存储在哪里?
    • @Enrique 在其他“全局”变量所在的相同数据/bss 区域中,它只是本地范围
    【解决方案4】:

    来自 Apple 的“The Objective-C Programming Language”:“声明一个变量 static 将其范围限制为仅类 - 并且仅限制在文件中实现的类的部分。(因此,与实例变量不同,静态变量不能被子类继承或直接操作)。”

    【讨论】:

      猜你喜欢
      • 2011-05-10
      • 1970-01-01
      • 2016-08-09
      • 1970-01-01
      • 2012-01-12
      • 2011-01-26
      • 2023-04-04
      相关资源
      最近更新 更多