en

hi, it seems you are using microsoft internet explorer. it doesn't match web standard and causes problems browsing this site. please please please use mozilla firefox or google chrome instead. thank you!

zh

哦哦!您正在使用Internet Explorer 瀏覽器,它與我們的網頁標準並不相容,可能會導致畫面顯示不正常。
請改用 Mozilla Firefox 或者 Google Chrome 才能正常瀏覽本網站,謝謝!

5.20.2013

變數的 Setter 與 Getter

在程式中我們可以透過一個變數的 Setter 和 Getter 方法函式來設定或是取用該變數的數值,由於這兩個方法函式太常被使用了,導致一般人根本不會去注意它們底是怎麼產生的,下列示範提供幾種方式來產生或是改寫 Setter 和 Getter 方法函式,讓我們在存取相關的變數實體時,能有更多的應用。


起始設定
首先,我們在程式中的 @interface 區段裡宣告一個 NSInteger 型態的變數實體,如下。
NSInteger myInt;
接著,在實作中將設定這個變數實體,並傾印出來。
myInt = 5;
NSLog(@"%d", myInt);

執行結果

上述是一個在簡單不過的程式,然而我們還並未使用到 Setter 和 Getter 方法函式,請在 @interface 區段中補上 @property,和在 @implementation 區段中補上 @synthesize 來啟用 Setter 和 Getter 方法函式。
@property NSInteger myInt;
@synthesize myInt = _myInt;
//或是 @synthesize myInt;

@property 會對物件實體自動宣告出 Setter 和 Getter 方法函式,而 @synthesize 則會對物件實體自動實作 Setter 和 Getter 方法函式中的內容,最後,我們就可以透過下列這些段落中不同的方法,來設定或是取用該變數的數值。


Setter 和 Getter
在補上 @property 之後,你會發現原先的程式法中多了兩個方法可以用,因此,在執行上我們可以使用下列程式碼來達到和原先預期一樣的執行結果。
[self setMyInt:5];
NSLog(@"%d", [self myInt]);

執行結果


改寫 Setter 和 Getter
透過改寫 Setter 和 Getter 方法函式的方法,我們可以在呼叫函式實作些額外的事情,如下。
- (void)setMyInt: (int) newInt {
    NSLog(@"setter 方法函式");
    myInt = newInt;
}

- (int)myInt {
    NSLog(@"getter 方法函式");
    return myInt;
}

[self setMyInt:5];

NSLog(@"%d", [self myInt]);

執行結果


使用底線 _ 符號
在 Xcode 4.4 與 iOS SDK 6.0 的環境下,我們可以直接使用底線符號來取代 instance variable 的名字,而在使用 @synthesize 之後,我們又可以將 @interface 區段裡所宣告的 NSInteger instance variable 給省略,因此,整段程式碼也可以寫成這樣,如下。
//@interface 區段
@property NSInteger myInt;

//@implementation 區段
@synthesize myInt = _myInt;

- (void)setMyInt: (int) newInt {
    _myInt = newInt;
    NSLog(@"setter 方法函式");
}

- (int)myInt {
    NSLog(@"getter 方法函式");
    return _myInt;
}

[self setMyInt:5];

NSLog(@"%d", [self myInt]);

執行結果







5 則留言:

  1. 很高興這個部落格又開始更新~
    我現在都使用self.xxx來存取@property變數,
    沒有寫@synthesize,
    請問哪種方法會比較好?

    回覆刪除
    回覆
    1. cg2010studio 您好

      你用dot(點)的方式來呼叫變數就不需要使用 @property 了唷,
      你用了 @property 就表示你要用 Setter 和 Getter,就是使用底線,或是 中括號「[self xxx]」來存取。

      刪除
    2. 哪種方法比較好,我建議維持物件封裝的原則使用 setter 與 getter 較佳,當然如果你有設計上的考量,也可以使用dot來存取。

      至於兩者的差別,你可以google一下 「setter getter」,這是物件導向 oop 很常使用的技巧之一!

      刪除
  2. 匿名6/16/2013

    你用self. 方法時 就是調用了setter 方法

    不用@property 是直接 _myInt = 是對全域變數直接賦值

    回覆刪除
    回覆
    1. 您好:
      嗯~謝謝您的指教!

      刪除