Objective-C 中的静态变量——它们有啥作用?

Posted

技术标签:

【中文标题】Objective-C 中的静态变量——它们有啥作用?【英文标题】:static variables in Objective-C - what do they do?Objective-C 中的静态变量——它们有什么作用? 【发布时间】:2011-06-25 07:15:53 【问题描述】:

我看过一些讨论什么是静态变量的帖子,我想我明白了 - 但我很想快速编写(或找到)一个同时使用常规变量和静态变量的程序,并排,并查看它们如何/何时以不同方式运行。一些快速的脏代码,可能是两个 int vars 和几个 NSLog 跟踪语句,只是为了看看它们有什么不同。

有人有任何提示/想法/代码可以说明静态变量与常规变量有何不同?

【问题讨论】:

【参考方案1】:

在 C 和 Objective-C 中,static 变量是为程序的整个生命周期分配的变量。这与 自动 变量不同,其生命周期存在于单个函数调用中;以及动态分配的变量,如对象,不再使用时可以从内存中释放。更简单地说,静态变量的值在所有函数/方法调用中都保持不变。当在函数外部声明时,静态变量对声明它的文件中的所有内容都是可见的;在函数或方法中声明时,它仅在该函数或方法中可见,但在调用之间保留该值。

假设你有这个:

int f(void)

    int i = 5;
    i += 10;
    return i;

每次调用f() 都会返回值15

现在说你有这个:

int g(void)

    static int i = 5;
    i += 10;
    return i;

第一次调用g(),将返回值15。第二次,25 将被返回,因为i 保持其值15,然后自增10。第三次调用,35 将被返回。以此类推。

在 Objective-C 类的上下文中,静态变量通常用于模仿 类变量,因为 Objective-C 没有类变量(其他语言,如 Java,有)。例如,假设您想延迟初始化一个对象,并且只返回该对象。你可能会看到:

static MyObject *obj = nil;

@implementation MyObject

+ (id)sharedObject

    if (obj == nil) obj = [[MyObject alloc] init];
    return obj;


@end

obj 将在第一次调用classObject 时被初始化; classObject 的后续调用将返回相同的对象。您可以通过记录对象的地址来检查这一点:

NSLog(@"obj is at %p", [MyObject sharedObject]);
NSLog(@"obj is at %p", [MyObject sharedObject]);    // Will print the same address both times

此外,obj 将对MyObject 中的所有方法可见。

这种技术也用于在 Objective-C 中实现单例类。

【讨论】:

很好的解释——尽管命名约定似乎是倒退的! :-) 我的意思是:STATIC这个词的意思是不变的东西,但它是静态变量——从你的“int f(void)”与“int g(void)”的例子来看——是一个它的价值似乎在不断变化——它根本不是一成不变的! 想一想,为什么叫“静态”呢?什么是静态的? 没问题。请注意,您可能还想更改 NSLog 部分。此外,在单例模式中,我会将static MyObject *obj = nil; 放在sharedObject 中。因为它可能是您访问obj 的唯一地方。 来自 Java,具有静态 int i = 5 的语法;在一个方法里面总是让我失望。我一直认为方法内部的赋值是为 i 赋值一个新值 5。 另一个注意事项:如果变量在头文件中被定义为静态,那么每个包含头文件的实现文件 (.m) 都会获得它自己的该变量的副本。【参考方案2】:

static 的工作方式与 C 中的差不多。

    它只能初始化一个变量一次。

    @implementationblock 上方的文件中声明一个静态变量将仅适用于整个文件。

【讨论】:

【参考方案3】:

“静态”更多地是指变量的属性(谁在哪里)而不仅仅是值。与其他语言不同的是,它专门指代值。

粘性

这就像将 var 固定到特定位置,无论是在函数内部还是在实现中。

私人

它具有与“私有”变量相似的属性,因为它对兄弟姐妹或父母不可见,但孩子可以访问。

优雅

这是一个带有默认值的声明。就像在其他语言中,您在类中定义变量并分配它们的“默认”值:

private int myNumber = 3;

这为我们提供了函数内的“类类”变量。声明一次,然后当函数操作该值时,该值将被保留。下次调用该函数时,该值将与上一个“循环”之后的值相同,就像您希望类变量的值在操作后保持不变一样。

【讨论】:

以上是关于Objective-C 中的静态变量——它们有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章

C 函数中的静态变量有啥用? [复制]

Objective-C/Swift中定义常量有啥区别?

闭包有啥好处,它们通常在啥时候使用?

静态存储变量STATIC有啥用举个例吧,好像和全局变量还有些联系啊

java中方法没有返回值用啥作返回类型

java 类中静态变量 和 单例模式下对象中的成员变量 有啥区别?使用场景是啥?