接口实现中静态变量的含义是啥?
Posted
技术标签:
【中文标题】接口实现中静态变量的含义是啥?【英文标题】:What's the meaning of static variables in an implementation of an interface?接口实现中静态变量的含义是什么? 【发布时间】:2010-11-08 09:26:59 【问题描述】:在接口的实现中定义静态变量时,我不太了解。在方法中,我确实了解它们与局部变量的区别,但不是直接在实现中定义时。
看看这些例子。这两者实际上有什么区别?
#include "MyClass.h"
@implementation MyClass
int myInt;
...
@end
还有:
#include "MyClass.h"
@implementation MyClass
static int myInt;
...
@end
myInt
在这两种情况下对所有方法都是可见的,如果我解释了我正确运行的测试,myInt
在这两种情况下对于类的不同实例都是同一个变量。
【问题讨论】:
见***.com/a/4965145/654870 【参考方案1】:该上下文中的“静态”关键字与普通 C 中的关键字相同:它将 myInt 的范围限制为当前文件。
【讨论】:
另外,在@implementation 内部定义非局部变量与在外部定义没有区别。 但这真的对实现文件中的定义有任何影响吗?反正它们不包括在内。 假设你声明了 int Varibale;在两个不同的实现文件中。由于重复符号,您将在构建时遇到错误。 这是否意味着它充当“私人”访问修饰符? 没有。 C++ 中的“private”关键字只是添加了编译器强制限制谁可以访问变量或方法。 'static' 将其范围限定为它所在的文件,这是非常不同的。【参考方案2】:“在 C 和 Objective-C 中,静态变量是在程序的整个生命周期中分配的变量。这与自动变量相反,自动变量的生命周期存在于单个函数调用中;并且动态分配像对象这样的变量,可以在不再使用时从内存中释放。更简单地说,静态变量的值在所有函数/方法调用中都保持不变。当在函数外部声明时,静态变量对文件中的所有内容都是可见的它是声明的;当在函数或方法中声明时,它仅在该函数或方法中可见,但在调用之间保留该值。"
在这里查看完整的解释:
https://***.com/a/4965145/951349
【讨论】:
【参考方案3】:不幸的是,它会根据你使用它的位置而产生不同的效果。
静态函数: 默认情况下,所有函数都有一个全局范围。 static 说明符可让您将函数的范围限制为当前文件。
静态局部变量: 当您在局部变量上使用 static 修饰符时,函数会在调用期间“记住”它的值。例如,以下 sn-p 中的 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;
静态关键字的这种使用不会影响局部变量的作用域。 阅读有关static keyword 的更多信息。
【讨论】:
静态关键字将强制其行在整个应用程序运行时仅执行一次——无论调用次数如何! 静态变量“currentCount”存储在内存的哪个位置?它不能在 countByTwo 的帧中,因为该帧在函数结束时被释放。那么它存储在哪里? @Enrique 在其他“全局”变量所在的相同数据/bss 区域中,它只是本地范围【参考方案4】:来自 Apple 的“The Objective-C Programming Language”:“声明一个变量 static 将其范围限制为仅类 - 并且仅限制在文件中实现的类的部分。(因此,与实例变量不同,静态变量不能被子类继承或直接操作)。”
【讨论】:
以上是关于接口实现中静态变量的含义是啥?的主要内容,如果未能解决你的问题,请参考以下文章