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

qua*_*ano 68 variables static objective-c static-variables

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

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

#include "MyClass.h"

@implementation MyClass
int myInt;
...
@end
Run Code Online (Sandbox Code Playgroud)

和:

#include "MyClass.h"

@implementation MyClass
static int myInt;
...
@end
Run Code Online (Sandbox Code Playgroud)

myInt在两种情况下,所有方法都可以看到,如果我解释了一个正确运行的测试,那么myInt在这两种情况下,对于不同类的实例,它们都是相同的变量.

app*_*ted 87

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

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

静态局部变量:
局部变量上使用静态修饰符时,该函数会"调用"其在调用中的值.例如,以下代码段中的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;
}
Run Code Online (Sandbox Code Playgroud)

这种static关键字的使用不会影响局部变量的范围.
阅读有关static关键字的更多信息.

  • static关键字将强制其行仅对整个应用程序运行时执行一次 - 无论调用的数量是多少! (7认同)

smo*_*gan 68

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

  • 此外,在@implementation中定义非局部变量与在外部定义它没有什么不同. (12认同)
  • 假设您声明了int Varibale; 在两个不同的实现文件中.由于重复的符号,您将在构建时遇到错误. (8认同)

smi*_*Bot 20

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

在这里查看完整的说明:

/sf/answers/347560181/


c r*_*ald 16

从Apple的"Objective-C编程语言":"声明变量static将其范围限制为仅仅是类 - 并且只是在文件中实现的类的部分."因此,与实例变量不同,静态变量不能被继承通过子类或由子类直接操纵."