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关键字的更多信息.
smo*_*gan 68
该上下文中的'static'关键字与它在plain C中的相同:它将myInt的范围限制为当前文件.
smi*_*Bot 20
"在C和Objective-C中,静态变量是为程序的整个生命周期分配的变量.这与自动变量形成对比,自动变量的寿命在单个函数调用期间存在;动态分配的变量如对象当不再使用时,可以从内存中释放.更简单地说,在所有函数/方法调用中都保持静态变量的值.当在函数外部声明时,静态变量对于文件中的所有内容都是可见的.声明;当在函数或方法中声明时,它只在该函数或方法中可见,但在调用之间保留该值."
在这里查看完整的说明:
c r*_*ald 16
从Apple的"Objective-C编程语言":"声明变量static将其范围限制为仅仅是类 - 并且只是在文件中实现的类的部分."因此,与实例变量不同,静态变量不能被继承通过子类或由子类直接操纵."