但是在 iOS 開發時使用 tableview 一定有看過下面的寫法.
static NSString *CellIdentifed = @"CellID";
....下略
static 在變數前表示將該變數宣告成 "靜態" 變數. 很多書或資料上都有介紹 static 的用法.
一直以來我也沒對他多做深入研究, 今日咱家技術長對 static 的一番解釋, 讓我對 static 有徹底了解的感覺.
要真正了解 static, 果然還是得從記憶體的角度去解釋.
EX:
static NSString *str = @"someStr";
表示系統會在記憶體中分配一塊固定的記憶體給 str 這個變數, 變數名稱必須是唯一.
之後若重覆存取 str, 該變數在記憶體中的位置也不會改變.
什麼意思呢? 舉個簡單的例子好了
假設今天有兩個 method 如下
-(void) helloStatic { static int a=0; NSLog(@"static a = %d", a++); }與
-(void) noStatic { int a=0; NSLog(@" a = %d", a++); }然後在 viewDidLoad 呼叫這兩個 method, 如下
-(void)viewDidLoad { int i = 0; for(i=0;i<5;i++){ [self helloStatic]; } for(i=0;i<5;i++){ [self noStatic]; } }那麼印出來的結果會是
static a = 0 static a = 1 static a = 2 static a = 3 static a = 4 a = 0 a = 0 a = 0 a = 0 a = 0Why???
在 viewDidLoad 中, 分別呼叫了五次 helloStatic 與 noStatic
helloStatic 中使用 static 修飾詞, 所以每次在對 a 這個變數做存取時, 系統都在同一個固定的記憶體位址做+1的動作, 所以印出來的結果會是 0 ~ 4.
但 noStatic 沒有使用 static, 所以每次呼叫 noStatic 這個方法時, 系統都會分配不同的記憶體位址給 a 且初始值為 0, 所以印出來5次的值皆為 0.
至於要怎麼在同一個檔案中誇 method 存取 static 變數? 只要使用 extern 就可以了.
一樣, 人腦 compiler 而己, 有錯誤請指正, 感謝各位
沒有留言:
張貼留言