接口实现中的静态变量是什么意思?


68

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

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

#include "MyClass.h"

@implementation MyClass
int myInt;
...
@end

和:

#include "MyClass.h"

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

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


Answers:


69

在这种情况下,“ static”关键字与纯C中的关键字相同:它将myInt的范围限制为当前文件。


12
同样,在@implementation内部定义非局部变量与在外部定义非局部变量没有什么不同。
sigjuice

但这是否真的对实现文件中的定义有所不同?无论如何,它们都不包括在内。
quano

8
假设您将int Varibale声明为int;在两个不同的实现文件中。由于符号重复,在构建时会出现错误。
Denis Mikhaylov '04年5

1
这是否意味着它充当“私有”访问修饰符?
glesage

1
否。C++中的'private'关键字仅添加了对谁可以访问变量或方法的编译器强制性限制。“静态”将其范围限定为仅位于其中的文件,这是非常不同的。
smorgan

88

不幸的是,根据您使用的位置,它具有不同的效果。

静态函数:
默认情况下,所有函数都具有全局作用域。静态说明符使您可以将函数的范围限制为当前文件。

静态局部变量:
局部变量上使用static修饰符时,该函数在调用之间“记住”其值。例如,以下代码段中的currentCount变量永远不会重置,因此,我们可以让countByTwo()为我们记录,而不是将count存储在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关键字的更多信息。


7
static关键字将强制其行在整个应用程序运行时仅执行一次,无论调用多少!
亲爱的2016年

静态变量“ currentCount”在内存中的哪里存储?它不能在countByTwo的框架中,因为函数结束时该框架已释放。那么它存储在哪里呢?
Enrique

@Enrique与其他“全局”变量存在的数据/ bss区域相同,只是局部作用域
BjornW

21

“在C和Objective-C中,静态变量都是为程序的整个生命周期分配的变量。这与自动变量相反,自动变量的生命周期存在于单个函数调用中;动态变量如对象,它可以在不再使用时从内存中释放出来,更简单地说,在所有函数/方法调用中都会维护静态变量的值。声明;在函数或方法中声明时,它仅在该函数或方法中可见,但是在调用之间保留该值。”

在此处查看完整的解释:

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


17

从苹果公司的“ Objective-C编程语言”中:“声明静态变量将其范围限制为仅类-以及文件中实现的类的一部分。(因此,与实例变量不同,不能继承静态变量由子类或直接由子类操纵)。”

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.