Objective-C中的静态变量 - 他们做了什么?

时间:2011-02-11 02:28:41

标签: objective-c static var

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

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

3 个答案:

答案 0 :(得分:126)

在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,do)。例如,假设你想懒惰地初始化一个对象,并且只返回该对象。你可能会看到这个:

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中实现单例类。

答案 1 :(得分:2)

静态作品大多与C一样。

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

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

答案 2 :(得分:1)

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

  • 粘性

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

  • 私人

它具有与“私有”var类似的属性,因为它对兄弟或父母不可见,但是孩子可以访问。

  • 优等

这是一个默认值的声明。与在其他语言中一样,您可以在类中定义变量并指定其“默认”值:

private int myNumber = 3;

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