33

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

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

4

3 回答 3

135

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

假设你有这个:

int f(void)
{
    int i = 5;
    i += 10;
    return i;
}

每次调用f()都会返回 value 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 中实现单例类。

于 2011-02-11T02:46:26.237 回答
2

static 的工作方式与 C 中的大部分情况类似。

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

  2. 在块上方的文件中声明变量静态@implementation将仅适用于整个文件。

于 2011-02-11T02:47:03.960 回答
1

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

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

  • 私人的

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

  • 优雅

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

private int myNumber = 3;

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

于 2013-12-11T17:22:23.720 回答