static variables in Objective-C - what do they do?

后端 未结 3 1133
旧巷少年郎
旧巷少年郎 2020-12-07 08:46

I\'ve seen a few posts discussing what a static variable is and I think I get it - but I\'d love to quickly write (or find) a program that utilizes both a regular and a stat

3条回答
  •  南笙
    南笙 (楼主)
    2020-12-07 09:32

    In both C and Objective-C, a static variable is a variable that is allocated for the entire lifetime of a program. This is in contrast to automatic variables, whose lifetime exists during a single function call; and dynamically-allocated variables like objects, which can be released from memory when no longer used. More simply put, a static variable's value is maintained throughout all function/method calls. When declared outside of a function, a static variable is visible to everything within the file in which it is declared; when declared inside a function or method, it is visible only within that function or method, but the value is retained between calls.

    Say you have this:

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

    Every call to f() will return the value 15.

    Now say you have this:

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

    The first time g() is called, the value 15 will be returned. The second time, 25 will be returned, as i maintained its value of 15 and then incremented itself by 10. The third call, 35 will be returned. And so on.

    In the context of Objective-C classes, static variables are often used to mimic class variables, as Objective-C does not have class variables (other languages, such as Java, do). For instance, say you want to lazily initialize an object, and only return that object. You might see this:

    static MyObject *obj = nil;
    
    @implementation MyObject
    
    + (id)sharedObject
    {
        if (obj == nil) obj = [[MyObject alloc] init];
        return obj;
    }
    
    @end
    

    obj will be initialized the first time classObject is called; subsequent invocations of classObject will return the same object. You could check this by logging the address of the object:

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

    Furthermore, obj will be visible to all methods in MyObject.

    This technique is used to implemented singleton classes in Objective-C as well.

提交回复
热议问题