接口实现中静态变量的含义是啥?

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 将其范围限制为仅类 - 并且仅限制在文件中实现的类的部分。(因此,与实例变量不同,静态变量不能被子类继承或直接操作)。”

【讨论】:

以上是关于接口实现中静态变量的含义是啥?的主要内容,如果未能解决你的问题,请参考以下文章

java中声明一个类的时候用abstract 和interface同时声明是啥含义?

Java 8-接口的默认方法和静态方法

抽象类与接口

Java里的包,类,接口,枚举是啥意思

java中接口的定义是啥?

为啥接口变量默认是静态的和最终的?