OC屬性的setter和getter方法

一基括、setter和getter的一般寫法

setter和getter器可以說是一個(gè)類最基本的東西颜懊,任何一門面向?qū)ο?/code>的語言,都又這個(gè)概念风皿,C++河爹、java等等。因?yàn)閟etter和getter是對面向?qū)ο笳Z言封裝的最基本的支持桐款。
在Objective-C的setter和getter器咸这,當(dāng)然也和一般的語言沒有什么不同。只不過魔眨,添加了一些自己的特性媳维。
比如有一個(gè)實(shí)例變量:int age;
先在.h文件中聲明setter和getter器

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

可以看出來,在Objective-C中setter器沒什么區(qū)別冰沙,不過getter器的方法名缺少了get侨艾,因?yàn)間et...在Objective-C有別的用處,所以getter器直接寫的就是變量名拓挥。

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

  • 一般的調(diào)用方法,是傳統(tǒng)的帶中括號[]的調(diào)用方法
  • 點(diǎn)調(diào)用的方式

oc語法關(guān)于點(diǎn)表達(dá)式的說明:"點(diǎn)表達(dá)式(.)看起來與C語言中的結(jié)構(gòu)體訪問以及Java語言匯總的對象訪問有點(diǎn)類似侥啤,其實(shí)這是oc的設(shè)計(jì)人員有意為之当叭。如果點(diǎn)表達(dá)式出現(xiàn)在等號左邊,該屬性名稱的setter方法將被調(diào)用盖灸。如果點(diǎn)表達(dá)式出現(xiàn)在右邊蚁鳖,該屬性名稱的getter方法將被調(diào)用。"

三赁炎、引入屬性@property改進(jìn)setter和getter

每次要為一個(gè)屬性寫上getter和setter醉箕,不得不十分麻煩,所以蘋果公司為OC引入了@property,用來改進(jìn)setter和getter

  • 在ios第一版中讥裤,我們?yōu)檩敵隹谕瑫r(shí)聲明了屬性和底層實(shí)例變量放棒,那時(shí),屬性是oc語言的一個(gè)新的機(jī)制己英,并且要求你必須聲明與之對應(yīng)的實(shí)例變量间螟,例如:
    .h

.m

  • 在Xcode中間的一個(gè)版本中,不再需要為屬性聲明實(shí)例變量了损肛,因?yàn)锧synthesize默認(rèn)會去訪問str的同名厢破,如果找不到同名變量,會自動生成一個(gè)叫做str的私有同名變量治拿。
    .h

.m

  • 在xcode4.5及以后的版本中摩泪,直接把@synthesize給省略
    .h

編譯器會自動為你生成setter和getter方法 和 以下劃線開頭的實(shí)例變量_str,不需要自己手動再去寫實(shí)例變量忍啤。

在這里說明一下@synthesize的作用
1加勤、一個(gè)作用就是讓編譯器為你自動生成setter與getter方法。
2同波、還有一個(gè)作用,可以指定與屬性對應(yīng)的實(shí)例變量叠国,例如@synthesize str = xxx;那么操作的實(shí)例變量是xxx未檩,而不是_str了。如果.m文件中寫了@synthesize str;那么生成的實(shí)例變量就是str粟焊;如果沒寫@synthesize str;那么生成的實(shí)例變量就是_str冤狡。(注意:_str這個(gè)實(shí)例變量是不存在的). 在老式的代碼中,@property只能寫在@interface @end中项棠,@synthesize只能寫在@implementation @end中悲雳,自從xcode 4.5及以后的版本中,@property就獨(dú)攬了@property和@synthesize的功能香追。
@property (nonatomic, copy) NSString *str;這句話完成了3個(gè)功能:
1)生成_str成員變量的getter和setter方法的聲明合瓢;
2)生成_str成員變量setter和getter方法的實(shí)現(xiàn);
3)生成一個(gè)_str的成員變量透典。(注意:這種方式生成的成員變量是private的)

四晴楔、對屬性的一些設(shè)置

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
舉個(gè)例子:

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

2茸时、設(shè)置只讀或讀寫
readwrite:表示既有g(shù)etter贡定,也有setter
readonly:表示只有g(shù)etter,沒有setter

這兩個(gè)屬性是互相排斥的可都,只能存在一個(gè)缓待。

五果正、屬性重寫setter和getter方法

使用屬性@property能夠幫我們省去了很多繁雜的工作砌们,但有的時(shí)候我們在使用屬性的時(shí)候還是需要去重寫一下其setter和getter方法份帐,這個(gè)時(shí)候我們應(yīng)該怎么做呢

  • 如果只重寫setter和getter其中之一雾鬼,可以直接重寫
  • 如果同時(shí)重寫setter和getter祈餐,需要加上@synthesize propertyName = _propertyName;不然系統(tǒng)會不認(rèn)_str产园。因?yàn)槿绻阃瑫r(shí)重寫了getter和setter方法坯约,系統(tǒng)就不會幫你自動生成這個(gè)_str變量盖溺,所以當(dāng)然報(bào)錯(cuò)說不認(rèn)識這個(gè)變量答姥。所以得手動指定成員變量铣除,然后再同時(shí)重寫了getter和setter方法。

注意事項(xiàng):

在重寫set和get時(shí)鹦付,容易犯如下錯(cuò)誤尚粘,會造成死循環(huán)。
1敲长、在set方法中郎嫁,self.age=age;相當(dāng)于是[self setAge:age];
2、在get方法中祈噪,return self.age;相當(dāng)于是[self age];

以下情況下泽铛,都不會autosynthesis(自動合成):

1、同時(shí)重寫setter和getter時(shí)
2辑鲤、重寫了只讀屬性的getter時(shí)
3盔腔、使用了@dynamic時(shí)
4、在@protocol中定義的所有屬性
5遂填、在Category中定義的所有屬性
6铲觉、重載的屬性

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市吓坚,隨后出現(xiàn)的幾起案子撵幽,更是在濱河造成了極大的恐慌,老刑警劉巖礁击,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盐杂,死亡現(xiàn)場離奇詭異逗载,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)链烈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門厉斟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人强衡,你說我怎么就攤上這事擦秽。” “怎么了漩勤?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵感挥,是天一觀的道長。 經(jīng)常有香客問我越败,道長触幼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任究飞,我火速辦了婚禮置谦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘亿傅。我一直安慰自己媒峡,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布袱蜡。 她就那樣靜靜地躺著丝蹭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪坪蚁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天镜沽,我揣著相機(jī)與錄音敏晤,去河邊找鬼。 笑死缅茉,一個(gè)胖子當(dāng)著我的面吹牛嘴脾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蔬墩,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼译打,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了拇颅?” 一聲冷哼從身側(cè)響起奏司,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎樟插,沒想到半個(gè)月后韵洋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體竿刁,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年搪缨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了食拜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,834評論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡副编,死狀恐怖负甸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情痹届,我是刑警寧澤呻待,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站短纵,受9級特大地震影響带污,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜香到,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一鱼冀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧悠就,春花似錦千绪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至炸茧,卻和暖如春瑞妇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背梭冠。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工辕狰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人控漠。 一個(gè)月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓蔓倍,卻偏偏與公主長得像,于是被迫代替她去往敵國和親盐捷。 傳聞我的和親對象是個(gè)殘疾皇子偶翅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內(nèi)容