Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 什么';接口实现中静态变量的含义是什么?_Objective C_Variables_Static_Static Variables - Fatal编程技术网

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;
}