Objective-C的setter和getter

來源:互聯網
上載者:User

一、setter和getter的一般寫法

 setter和getter器可以說是一個類最基本的東西,任何一門物件導向的語言,都又這個概念,C++、java等等。因為setter和getter是對物件導向語言封裝的最基本的支援。

在Objective-C的setter和getter器,當然也和一般的語言沒有什麼不同。只不過,添加了一些自己的特性。

比如有一個執行個體變數:int age;

先在.h檔案中聲明setter和getter器

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

然後在.m檔案中具體實現

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

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

二、getter和setter 的調用方法

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

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

點調用的方式

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

三、setter和getter的改進寫法

每次要為一個屬性寫上getter和setter,不得不手十分麻煩,所以有了更簡單的寫法,

在.h檔案裡,直接這樣寫,表示聲明了一個執行個體屬性和它的getter和setter器

@property int age;

然後在.m檔案中這樣寫,表示實現setteer和getter

@synthesize age;

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

四、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)、設定存取方法的名字

預設的getter和setter器的名稱是和變數名關聯的,一定是setVirableName和virableName,比如上面的變數age,setter是setAge,getter是age。

可以通過設定@property中的setter和getter屬性來修改setter和getter器的方法名。

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和iOS 4,使用指定取而代之)。

copy:調用原始對象的copy()方法,建立一個原始對象的副本,用於分配給新的引用。原始的對象在調用release方法。當然這個屬性只用於實現了NSCopying協議的物件類型。

assign:指定使用簡單的賦值的setter。這個屬性是違約。  使用這個屬性對於標量的類型(如NSInteger和CGRect等);

retain: 指定retain應該調用對象上的。原始的對象在調用release。在OS X v10.6和之後,您可以使用這個關鍵字用於記憶體管理方面。

(4)、訪問屬性的安全執行緒

nonatomic:表示不考慮安全執行緒

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.