在一个接口的实现中静态variables的含义是什么?
在接口的实现中定义时,我不太了解静态variables。 在方法中,我明白它们与局部variables的区别,但不是直接在实现中定义的。
看看这些例子。 这两个实际上有什么区别?
#include "MyClass.h" @implementation MyClass int myInt; ... @end
和:
#include "MyClass.h" @implementation MyClass static int myInt; ... @end
myInt
在这两种情况下对所有的方法都是可见的,如果我解释了一个正确运行的testing, myInt
在两种情况下都将是类的不同实例的相同variables。
该上下文中的“静态”关键字与纯C中的相同:它将myInt的范围限制为当前文件。
不幸的是,它有不同的效果,取决于你在哪里使用它。
静态函数:
默认情况下,所有函数都具有全局作用域。 静态指定符允许您将函数的作用域限制为当前文件。
静态局部variables:
在局部variables上使用静态修饰符时,函数“会记住”其调用中的值。 例如,下面片段中的currentCountvariables永远不会被重置,所以我们可以让countByTwo()为我们做logging,而不是将计数存储在main()中的variables中。
// 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关键字的使用不影响局部variables的范围。
详细了解static关键字 。
从Apple的“Objective-C编程语言”中:“声明一个variablesstatic将其范围限制在类中 – 仅仅是文件中实现的类的一部分(因此,与实例variables不同,静态variables不能被inheritance由或直接由子类操纵)“。
“在C和Objective-C中,静态variables是一个分配给程序整个生命周期的variables,这与自动variables形成对比,自动variables的生存期在单个函数调用期间存在;dynamic分配的variables,在不再使用的时候可以从内存中释放,更简单的说,在所有的函数/方法调用中都会保留一个静态variables的值,当在一个函数之外声明时,静态variables对它所在的文件声明;当在函数或方法中声明时,只在该函数或方法中可见,但在调用之间保留该值。
看看这里的完整解释: