Objective c 什么';接口实现中静态变量的含义是什么?
当在接口的实现中定义静态变量时,我不太理解。在方法中,我确实理解它们与局部变量的区别,但在实现中直接定义时却不理解 看看这些例子。这两者实际上有什么区别Objective c 什么';接口实现中静态变量的含义是什么?,objective-c,variables,static,static-variables,Objective C,Variables,Static,Static Variables,当在接口的实现中定义静态变量时,我不太理解。在方法中,我确实理解它们与局部变量的区别,但在实现中直接定义时却不理解 看看这些例子。这两者实际上有什么区别 #include "MyClass.h" @implementation MyClass int myInt; ... @end 以及: myInt在这两种情况下对所有方法都可见,如果我正确地解释了一个测试,myInt对于类的不同实例,在这两种情况下都是相同的变量。该上下文中的“static”关键字与普通C中的相同:它将myInt的范围限制
#include "MyClass.h"
@implementation MyClass
int myInt;
...
@end
以及:
myInt
在这两种情况下对所有方法都可见,如果我正确地解释了一个测试,myInt
对于类的不同实例,在这两种情况下都是相同的变量。该上下文中的“static”关键字与普通C中的相同:它将myInt的范围限制为当前文件。来自Apple的“Objective-C编程语言”:声明一个静态变量将其作用域限制为仅限于类,以及仅限于在文件中实现的类的一部分。(因此,与实例变量不同,静态变量不能由子类继承或直接由子类操作)。“不幸的是,它具有不同的效果,具体取决于您使用它的位置
静态功能:默认情况下,所有函数都有一个全局作用域。静态说明符允许您将函数的作用域限制为当前文件 静态局部变量:
当您对局部变量使用静态修饰符时,函数会在调用过程中“记住”其值。例如,以下代码段中的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;
}
//main.m
#进口
int countByTwo(){
静态int currentCount=0;
电流计数+=2;
返回电流计数;
}
int main(int argc,const char*argv[]{
@自动释放池{
NSLog(@“%d”,countByTwo());//2
NSLog(@“%d”,countByTwo());//4
NSLog(@“%d”,countByTwo());//6
}
返回0;
}
使用static关键字不会影响局部变量的范围。阅读更多关于。“在C和Objective-C中,静态变量是为程序的整个生命周期分配的变量。这与自动变量不同,自动变量的生命周期存在于单个函数调用期间;以及动态分配的变量,如对象,不再使用时可以从内存中释放。更简单地说,静态变量的值在所有函数/方法调用中都保持不变。当在函数外部声明时,静态变量对声明它的文件中的所有内容都可见;当在函数或方法中声明时,它仅在该函数或方法中可见,但在调用之间保留该值。” 请在此处查看完整的说明:
此外,在@implementation内部定义非局部变量与在@implementation外部定义没有什么不同。但这真的会对实现文件中的定义产生影响吗?它们无论如何都不包括在内。假设您在两个不同的实现文件中声明了int-Varibale;。由于重复的sy,您将在生成时出错mbols。这是否意味着它充当“私人”角色“访问修饰符?不”。C++中的“私有”关键字只是添加了编译器对谁可以访问变量或方法的强制限制。“static”将其作用域仅限于它所在的文件,这是非常不同的。请参阅,static关键字将强制其行在整个应用程序运行时仅执行一次,而不管调用的次数!静态变量“currentCount”存储在内存中的什么位置?它不能在countByTwo的帧中,因为该帧在函数结束时被释放。那么它存储在哪里?@Enrique与其他“全局”变量所在的数据/bss区域相同,只是局部范围
// 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;
}