Objective-C的setter和getter詳解

一.setter和getter的一般寫法

settergetter器可以說是一個類最基本的東西,任何一門面向對象的語言,都又這個概念,C++Java等等。因為settergetter是對面向對象語言封裝的最基本的支持。
Objective-Csettergetter器,當然也和一般的語言沒有什么不同。只不過,添加了一些自己的特性。
比如有一個實例變量:int age;
先在.h文件中聲明settergetter

    - (void)setAge:(int)newAge;  
    - (int)age;  

然后在.m文件中具體實現

    - (void)setAge:(int)newAge  
    {  
        age=newAge;  
    }  
    - (int)age  
    {  
        return age;  
    }  

可以看出來,在Objective-Csetter器沒什么區別,不過getter器的方法名缺少了get,因為getObjective-C有別的用處,所以getter器直接寫的就是變量名。

二、getter和setter 的調用方法

一般的調用方法,是傳統的帶中括號[ ]的調用方法,比如

    //比如上面的聲明是一個Person類  
    Person* person=[[Person alloc]init];  
    [person setAge:13];  
    int age=[person age];  

點調用的方式

    //點調用  
    person.age=13;  //.調用出現在=號左邊,相當于setter  
    int age=person.age   //.調用出現在=號的右邊,相當于getter  
    NSLog(@"%i",person.age);//這也是getter  

三、setter和getter的改進寫法

每次要為一個屬性寫上gettersetter,不得不手十分麻煩,所以有了更簡單的寫法,
.h文件里,直接這樣寫,表示聲明了一個實例屬性和它的gettersetter

  @property int age;  

然后在.m文件中這樣寫,表示實現setteergetter

 @synthesize age;  

這樣,就可以和以前一樣調用gettersetter了。

四、setter和getter的改進優化

可以看到,getter器的方法名直接就是變量名,方法名和變量名一樣,容易讓人迷糊,所以,可以這樣優化。
.h文件中依然這樣聲明

@property int age;  

.m文件中,這樣去寫,

    @synthesize age=_age; //加上一個_  
    //這么,我們就可以去使用_age   和使用age一樣  
    -(void)show  
    {  
        NSLog(@"%i",_age);  
    }  

五、@property的屬性

可以使用屬性來規定@property,設定的方式如下:
@property (attribute1[,attrubute2,...])
舉個例子:

 @property (nonatomic,strong) Engine* engine;  

如果你在@property設置了屬性,如果你使用@synthesize,那么它會自動幫你完成這些屬性的實現,如果你是自己手動的去完成實現的話,那么,你必須自己寫出這些屬性的實現。

(1)、設置訪問方法的名字

默認的gettersetter器的名稱是和變量名關聯的,一定是setVirableNamevirableName,比如上面的變量agesettersetAgegetterage

可以通過設置@property中的settergetter屬性來修改settergetter器的方法名。
getter=getterName
setter=setterName
舉個例子:

 @property (getter=show1,setter=show2:)int age;//現在,它的getter和setter的方法名字就變了  

注意:如果你設置了readonly屬性的話,那么你就不應該設置setter屬性,要不然會給出一個編譯器的警告。

(2)、設置只讀或讀寫
下面兩個屬性很好理解,
readwrite:表示既有getter,也有setter
readonly:表示只有getter,沒有setter
這兩個屬性是互相排斥的,只能存在一個。

(3)、定義setter的語義
下面的屬性指定setter語義設置訪問器。他們是互相排斥的。
strong:指定有很強的(擁有)關系到目標對象。
weak:指定有弱(non-owning)關系到目標對象。如果目的地對象銷毀,屬性值將自動設置為nil。(弱屬性不支持OS X上的v10.6和iOS4 ,使用指定取而代之)。
copy:調用原始對象的copy()方法,創建一個原始對象的副本,用于分配給新的引用。原始的對象在調用release方法。當然這個屬性只用于實現了NSCopying協議的對象類型。
assign:指定使用簡單的賦值的setter。這個屬性是違約。  使用這個屬性對于標量的類型(如NSIntegerCGRect等);
retain: 指定retain應該調用對象上的。原始的對象在調用release。在OS X v10.6和之后,您可以使用這個關鍵字用于內存管理方面。

(4)、訪問屬性的線程安全
nonatomic:表示不考慮線程安全

原創地址

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 我穿過碎裂的時間 遇見你 在你的穹頂點亮極光 再拼湊起衰老 與所有明亮的光陰 我穿過風與海的交集 尋找你 在每一句...
    林慕然閱讀 187評論 1 4
  • 一直等著沒有下手閱讀 169評論 0 0
  • 決定采用這種方式來紀念這段感情,也是不得已而為之 一來是為了顯示我的聰明才智,哈哈 二來,將來你放在家里也不會被其...
    MUMENGYUN閱讀 227評論 0 0
  • 人世間,唯有好吃的與好姑娘不可辜負。
    前端大神121212閱讀 184評論 0 0
  • 感賞今天好開心,錢寶寶啊我愛你,買到了自己喜歡的東西,用了一個美美的發型,好喜歡啊! 感賞自己讓自己開心讓自己感覺...
    童欣怡_中閱讀 128評論 0 0