static關鍵字的做用是什麼?

static的做用:經常使用來修飾變量。spa

全局變量被static修飾後,就稱之爲靜態全局變量;局部變量被static修飾後,就稱之爲靜態局部變量。統稱爲靜態變量。3d

若是須要進一步解釋下面的現象,能夠了解iOS的內存管理方面的知識,好比局部變量是放置在棧區,而全局變量和靜態變量是放置在靜態區的。code

 

1、static修飾局部變量orm

- (void)test {

    NSInteger i = 0;
    i++;

    static NSInteger m = 0;
    m++;

    NSLog(@"i = %ld, m = %ld", (long)i, (long)m);  

    NSString *normalString;

    static NSString *staticString;

    NSLog(@"normal = %p, static = %p", &normalString, &staticString); 

}

將上述方法在調用三次的打印結果是:blog

i = 1, m = 1

normal = 0x8e73d21, static = 0x928b78a89

i = 1, m = 2

normal = 0x8e73b09, static = 0x928b78a89

i = 1, m = 3

normal = 0x8e73c18, static = 0x928b78a89

總結:生命週期

當static關鍵字修飾局部變量時,只會對該變量初始化一次。內存

當static關鍵字修飾局部變量時,該變量在程序中只有一分內存。作用域

當static關鍵字修飾局部變量時,該變量的做用域不會改變。內存管理

當static關鍵字修飾局部變量時,該變量的生命週期被延長,直到程序結束才銷燬。io

 

2、static修飾全局變量

#import "ClassA.h"

// 聲明一個全局變量
NSInteger num;

@implementation ClassA

@end

在工程ClassA.m文件中證實一個全局變量,若是同時在其餘.m文件中也聲明一個全局變量NSIteger num,編譯的時候就會報錯。

在其餘文件中若是想訪問全局變量num,能夠import "ClassA.h"而後就能訪問,或者不import,使用extern 關鍵字也能得到全局變量,好比:

- (void)viewDidLoad {
    
    extern NSInteger num;
    NSLog(@"num = %ld", (long)num);
}

若是不想被整個工程文件所訪問到,可是能在所聲明的文件中自由訪問,就須要使用static關鍵字來聲明,以下:

#import "ClassA.h"

// 聲明一個靜態文件的全局變量
static NSInteger num;

@implementation ClassA

@end

總結:當用static關鍵字修飾全局變量時,該變量的做用域僅限於當前文件,工程中的其餘文件不能夠訪問到該全局變量。

相關文章
相關標籤/搜索