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

Sir*_*b33 31 static var objective-c

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

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

mip*_*adi 127

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

说你有这个:

int f(void)
{
    int i = 5;
    i += 10;
    return i;
}
Run Code Online (Sandbox Code Playgroud)

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

现在说你有这个:

int g(void)
{
    static int i = 5;
    i += 10;
    return i;
}
Run Code Online (Sandbox Code Playgroud)

第一次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
Run Code Online (Sandbox Code Playgroud)

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

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

此外,obj所有方法都可以看到MyObject.

该技术也用于在Objective-C中实现单例类.

  • 来自Java,有静态int i = 5的语法; 在一个方法内总是抛弃我.我总是想到一个方法中的赋值,即为i分配一个新的值5. (4认同)
  • 另一个注意事项:如果变量在头文件中定义为静态,那么包含头文件的每个实现文件(.m)都会获得它自己的变量副本. (3认同)