接口实现中静态变量的含义是什么?

时间:2009-07-06 13:45:52

标签: objective-c variables static static-variables

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

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

#include "MyClass.h"

@implementation MyClass
int myInt;
...
@end

#include "MyClass.h"

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

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

4 个答案:

答案 0 :(得分:85)

不幸的是,根据您使用它的不同,它会产生不同的效果。

静态功能
默认情况下,所有函数都具有全局范围。静态说明符允许您将函数的范围限制为当前文件。

静态局部变量:
在局部变量上使用static修饰符时,该函数会“调用”其在调用中的值。例如,以下代码段中的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关键字不会影响局部变量的范围 详细了解static keyword

答案 1 :(得分:68)

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

答案 2 :(得分:20)

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

点击此处查看完整说明:

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

答案 3 :(得分:16)

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