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

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

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

【问题讨论】:

    标签: objective-c static var


    【解决方案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 中的差不多。

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

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

    【讨论】:

      【解决方案3】:

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

      • 粘性

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

      • 私人

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

      • 优雅

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

      private int myNumber = 3;

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-14
        • 2011-08-27
        • 2012-01-26
        相关资源
        最近更新 更多