免费开源的iOS开发学习平台

OC变量Variable:3-静态变量static

在Objective-C中,在变量声明前加上关键字static,该变量就成为静态变量。静态变量的作用可以使局部变量保留多次调用同一个方法所取得的值。

1、在方法之内定义静态变量

静态变量只在程序开始执行时初始化一次,在不指定静态变量的值时,默认情况下,静态变量的初始值为0,并且多次调用方法时,保存这些数值。静态变量也可以在方法内部定义,此时,只能在该方法中使用定义的静态变量。

如下所示的代码中,在MYClass类中添加printStaticVariable方法,并在方法内部定义静态变量staticValue,该静态变量只能在printStaticVariable方法中使用,并且staticValue的初始值为0。

-(void)printStaticVariable{
    static int staticValue ;   
    NSLog(@"staticVar Value: %d",staticValue);    
    staticValue++;
}

当在main()中多次调用printStaticVariable方法时,staticValue的值会累加。如下所示:

#import <Foundation/Foundation.h>
#import "MYClass.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        MYClass *object = [[MYClass alloc] init];
        [object printStaticVariable];
        [object printStaticVariable];
        [object printStaticVariable];  
    }
    return 0;
}

运行结果如下。我们可以看到,在方法内部定义的静态变量值是累加的。

2、在方法之外定义静态变量

静态变量除了可以在方法内部定义之外,还可以在方法之外定义,此时,该类的所有方法都可以访问该静态变量。

如下所示,在@implementation之外定义一个静态变量staticValue2,并赋初始值100。在该类的中添加两个方法testStaticVarValue1和testStaticVarValue2,在这两个方法中都进行打印当前staticValue2的值,并且对staticValue2执行加1操作。

#import "MYClass.h"
static int staticValue2 = 100;
@interface MyClass ()
@end
-(void) testStaticVarValue1{
    NSLog(@"在方法1中打印静态变量的当前值: %d",staticValue2);
    staticValue2++;
}

-(void) testStaticVarValue2{
    NSLog(@"在方法2中打印静态变量的当前值: %d",staticValue2);
    staticValue2++;
}

在main()函数中,分别调用testStaticVarValue1方法和testStaticVarValue2方法;

#import <Foundation/Foundation.h>
#import "MYClass.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        MYClass *object = [[MYClass alloc] init];
        [object testStaticVarValue1];
        [object testStaticVarValue2];
        [object testStaticVarValue1];
        [object testStaticVarValue2];
    }
    return 0;
}

运行结果如下:

3、静态变量的重要特性

静态变量在开发中有2个重要特性需要我们重点关注:

  • 某个对象调用不同的方法,修改同一个静态变量,则该静态变量的值是累加的(见上面的例子);

  • 当同一个类的不同对象,修改同一个静态变量时,则该静态变量的值也是累加的。见下面的示例代码。

在main()函数中,再创建一个MyClass对象,并调用printAndIncreaseStaticVarValue方法,可以验证,此时静态变量staticValue2的值也是叠加的。

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSLog(@"--第一个MYClass对象中打印静态变量结果--");
        MYClass *object = [[MYClass alloc] init];
        [object testStaticVarValue1];
        [object testStaticVarValue2];
        [object printStaticVariable];
        NSLog(@"--第二个MYClass对象中打印静态变量结果--");
        MYClass *anotherObject = [[MYClass alloc] init];
        [anotherObject testStaticVarValue1];
        [anotherObject testStaticVarValue2];
        [anotherObject printStaticVariable];
    }
    return 0;
}

运行结果:

示例代码

https://github.com/99ios/3.5.3