Objective-C中的setter和getter使用

getter 和 setter 是對實例變量的一個設(shè)置和調(diào)用的作用

平時我們的實例變量都是@public的形式,這個形勢的實例變量誰都可以去修改,跟我們現(xiàn)實中的某種職業(yè)一樣。

這個時候就體現(xiàn)出封裝的作用了,我定義的實例變量只能我讓你用,你才能用。我讓你怎么去用,你才能怎么取用。

怎么才能實現(xiàn)我的霸權(quán)注意呢? 這個時候@protected的作用的出來了。我給我的數(shù)據(jù)建立了一個籠子。如果你要用需要用

我給你的鑰匙才能進去用我的東西。這個就是getter ,如果我想讓你怎么用,你才能怎么用的時候 這個就是setter

一、setter和getter的一般寫法

setter和getter器可以說是一個類最基本的東西,任何一門面向?qū)ο蟮恼Z言,都又這個概念,C++、Java等等。因為setter和getter是對面向?qū)ο笳Z言封裝的最基本的支持。

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

比如有一個實例變量:int age;

先在.h文件中聲明setter和getter器

-(void)setAge:(int)newAge;

-(int)age;

然后在.m文件中具體實現(xiàn)

-(void)setAge:(int)newAge

{

age=newAge;

}

-(int)age

{

return age;

}

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

二、getter和setter 的調(diào)用方法

一般的調(diào)用方法,是傳統(tǒng)的帶中括號[? ]的調(diào)用方法,比如

//比如上面的聲明是一個Person類

Person* person=[[Person alloc]init];

[person setAge:13];

int age=[person age];

點調(diào)用的方式

//點調(diào)用

person.age=13;? //.調(diào)用出現(xiàn)在=號左邊,相當(dāng)于setter

int age=person.age? //.調(diào)用出現(xiàn)在=號的右邊,相當(dāng)于getter

NSLog(@"%i",person.age);//這也是getter

三、setter和getter的改進寫法

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

在.h文件里,直接這樣寫,表示聲明了一個實例屬性和它的getter和setter器

@property int age;

然后在.m文件中這樣寫,表示實現(xiàn)setteer和getter

@synthesize age;

這樣,就可以和以前一樣調(diào)用getter和setter了。

四、setter和getter的改進優(yōu)化

可以看到,getter器的方法名直接就是變量名,方法名和變量名一樣,容易讓人迷糊,所以,可以這樣優(yōu)化。

在.h文件中依然這樣聲明

@property int age;

在.m文件中,這樣去寫,

@synthesize age=_age; //加上一個_

//這么,我們就可以去使用_age? 和使用age一樣

-(void)show

{

NSLog(@"%i",_age);

}

五、@property的屬性

可以使用屬性來規(guī)定@property,設(shè)定的方式如下:

@property (attribute1[,attrubute2,...])。

舉個例子:

@property (nonatomic,strong) Engine* engine;

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

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

默認(rèn)的getter和setter器的名稱是和變量名關(guān)聯(lián)的,一定是setVirableName和virableName,比如上面的變量age,setter是setAge,getter是age。

可以通過設(shè)置@property中的setter和getter屬性來修改setter和getter器的方法名。

getter=getterName

setter=setterName

舉個例子:

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

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

(2)、設(shè)置只讀或讀寫

下面兩個屬性很好理解,

readwrite:表示既有g(shù)etter,也有setter

readonly:表示只有g(shù)etter,沒有setter

這兩個屬性是互相排斥的,只能存在一個。

(3)、定義setter的語義

下面的屬性指定setter語義設(shè)置訪問器。他們是互相排斥的。

strong:指定有很強的(擁有)關(guān)系到目標(biāo)對象。

weak:指定有弱(non-owning)關(guān)系到目標(biāo)對象。如果目的地對象銷毀,屬性值將自動設(shè)置為nil。(弱屬性不支持OS X上的v10.6和iOS 4,使用指定取而代之)。

copy:調(diào)用原始對象的copy()方法,創(chuàng)建一個原始對象的副本,用于分配給新的引用。原始的對象在調(diào)用release方法。當(dāng)然這個屬性只用于實現(xiàn)了NSCopying協(xié)議的對象類型。

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

retain: 指定retain應(yīng)該調(diào)用對象上的。原始的對象在調(diào)用release。在OS X v10.6和之后,您可以使用這個關(guān)鍵字用于內(nèi)存管理方面。

(4)、訪問屬性的線程安全

nonatomic:表示不考慮線程安全

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Objective-C 1. import的用法 拷貝文件內(nèi)容可以自動防止文件的內(nèi)容被重復(fù)拷貝(#define宏定...
    馬文濤閱讀 5,477評論 3 17
  • 小時候 媽媽三十歲 知道我所有的不知道 能做我所有的不能夠 三十歲的女人如謎一樣 是一座莊嚴(yán)又溫馨的城堡 長大后 ...
    休休小妮閱讀 185評論 0 3
  • JSTL apache對EL表達(dá)式的擴展 jstl.jar包core 核心庫fmt 格式化標(biāo)簽庫 Core (c標(biāo)...
    大批閱讀 246評論 0 0
  • 任何使我宣泄的東西 不過是因為還抱有執(zhí)著 如果早已沒有希望 你看我還會不會過問你是誰
    未明花香閱讀 139評論 0 0
  • 昨個兒有個小寶寶把我最愛的簪子給弄斷了。當(dāng)時看到時真的好氣憤,突然一下子就覺察到當(dāng)下的那個憤怒,讓自己靜下來,過后...
    高藝菲Sophia閱讀 268評論 0 0

友情鏈接更多精彩內(nèi)容