72

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

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

#include "MyClass.h"

@implementation MyClass
int myInt;
...
@end

和:

#include "MyClass.h"

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

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

4

4 回答 4

93

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

静态函数:
默认情况下,所有函数都有一个全局范围。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 关键字的更多信息。

于 2013-11-05T11:10:11.313 回答
72

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

于 2009-07-06T14:57:39.923 回答
23

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

在此处查看完整的说明:

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

于 2014-11-01T19:56:42.300 回答
18

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

于 2013-02-21T16:32:00.280 回答