2013年8月2日 星期五

Objective-C 關於 static

static 這個變數的修飾詞, 也許是比較沒緣份, 個人沒有太多的機會去實際使用到.

但是在 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 = 0

Why???

在 viewDidLoad 中, 分別呼叫了五次 helloStatic 與 noStatic

helloStatic 中使用 static 修飾詞, 所以每次在對 a 這個變數做存取時, 系統都在同一個固定的記憶體位址做+1的動作, 所以印出來的結果會是 0 ~ 4.

但 noStatic 沒有使用 static, 所以每次呼叫 noStatic 這個方法時, 系統都會分配不同的記憶體位址給 a 且初始值為 0, 所以印出來5次的值皆為 0.

至於要怎麼在同一個檔案中誇  method 存取 static 變數? 只要使用 extern 就可以了.

一樣, 人腦 compiler 而己, 有錯誤請指正, 感謝各位