static的作用:常用來修飾變量。
全局變量被static修飾后,就稱之為靜態全局變量;局部變量被static修飾后,就稱之為靜態局部變量。統稱為靜態變量。
如果需要進一步解釋下面的現象,可以了解iOS的內存管理方面的知識,比如局部變量是放置在棧區,而全局變量和靜態變量是放置在靜態區的。
一、static修飾局部變量
- (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); }
將上述方法在調用三次的打印結果是:
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關鍵字修飾局部變量時,該變量的生命周期被延長,直到程序結束才銷毀。
二、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關鍵字修飾全局變量時,該變量的作用域僅限於當前文件,工程中的其他文件不可以訪問到該全局變量。