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關鍵字修飾全局變量時,該變量的做用域僅限於當前文件,工程中的其餘文件不能夠訪問到該全局變量。