[轉(zhuǎn)]OC中在.h和.m中聲明的屬性和成員變量

今天瀏覽別人的博客時(shí),發(fā)現(xiàn)一篇感覺(jué)不錯(cuò)的文章,收藏一下,希望可以幫助那些和我有相同困惑的小猿脏里。為表示對(duì)作者的尊重特此貼上鏈接:http://blog.csdn.net/mccand1234/article/details/52733270
特此感謝作者[憧憬-來(lái)自CSDN].

區(qū)別

IOS5之前

iOS第一版中她我,我們?yōu)檩敵隹谕瑫r(shí)聲明了屬性和底層實(shí)例變量虹曙,那時(shí),屬性是OC語(yǔ)言的一個(gè)新的機(jī)制番舆,并且要求你必須聲明與之對(duì)應(yīng)的實(shí)例變量酝碳,例如:
@interface MyViewController :UIViewController { UIButton *myButton; } @property (nonatomic, retain) UIButton *myButton; @end

IOS5之后

現(xiàn)在,蘋(píng)果將默認(rèn)編譯器從GCC轉(zhuǎn)換為L(zhǎng)LVM(low level virtual machine)恨狈,從此不再需要為屬性聲明實(shí)例變量了疏哗。如果LLVM發(fā)現(xiàn)一個(gè)沒(méi)有匹配實(shí)例變量的屬性,它將自動(dòng)創(chuàng)建一個(gè)以下劃線(xiàn)開(kāi)頭的實(shí)例變量
禾怠。因此返奉,在這個(gè)版本中贝搁,我們不再為輸出口聲明實(shí)例變量。 例如:MyViewController.h文件
@interface MyViewController :UIViewController @property (nonatomic, retain) UIButton *myButton; @end
在MyViewController.m文件中芽偏,編譯器也會(huì)自動(dòng)的生成一個(gè)實(shí)例變量_myButton雷逆。那么在.m文件中可以直接的使用_myButton實(shí)例變量,也可以通過(guò)屬性self.myButton.都是一樣的污尉。 注意這里的self.myButton其實(shí)是調(diào)用的myButton屬性的getter/setter方法膀哲。這與C++中點(diǎn)的使用是有區(qū)別的,C++中的點(diǎn)可以直接訪(fǎng)問(wèn)成員變量(也就是實(shí)例變量)被碗。 例如在oc中有如下代碼 .h文件
@interface MyViewController :UIViewController { NSString *name; } @end
.m文件中某宪,self.name 這樣的表達(dá)式是錯(cuò)誤的。xcode會(huì)提示你使用->,改成self->name就可以了锐朴。因?yàn)閛c中點(diǎn)表達(dá)式是表示調(diào)用方法兴喂,而上面的代碼中沒(méi)有name這個(gè)方法。 oc語(yǔ)法關(guān)于點(diǎn)表達(dá)式的說(shuō)明:點(diǎn)表達(dá)式(.)看起來(lái)與C語(yǔ)言中的結(jié)構(gòu)體訪(fǎng)問(wèn)以及Java語(yǔ)言匯總的對(duì)象訪(fǎng)問(wèn)有點(diǎn)類(lèi)似包颁,其實(shí)這是oc的設(shè)計(jì)人員有意為之瞻想。如果點(diǎn)表達(dá)式出現(xiàn)在等號(hào) = 左邊,該屬性名稱(chēng)的setter方法將被調(diào)用娩嚼。如果點(diǎn)表達(dá)式出現(xiàn)在右邊蘑险,該屬性名稱(chēng)的getter方法將被調(diào)用≡牢颍” 所以在oc中點(diǎn)表達(dá)式其實(shí)就是調(diào)用對(duì)象的setter和getter方法的一種快捷方式, 例如:dealie.blah = greeble 完全等價(jià)于 [dealie.blah setBlah:greeble];
以前的用法佃迄,聲明屬性跟與之對(duì)應(yīng)的實(shí)例變量:
@interface MyViewController :UIViewControlle { UIButton *myButton; } @property (nonatomic, retain) UIButton *myButton; @end
這種方法基本上使用最多,現(xiàn)在大部分也是在使用贵少,因?yàn)楹芏嚅_(kāi)源的代碼都是這種方式呵俏。但是ios5更新之后,蘋(píng)果是建議以以下的方式來(lái)使用:
@interface MyViewController :UIViewController @property (nonatomic, retain) UIButton *myButton; @end
因?yàn)榫幾g器會(huì)自動(dòng)為你生成以下劃線(xiàn)開(kāi)頭的實(shí)例變量_myButton滔灶,不需要自己手動(dòng)再去寫(xiě)實(shí)例變量
普碎。而且也不需要在.m文件中寫(xiě)@synthesize myButton;也會(huì)自動(dòng)為你生成setter录平,getter方法麻车。@synthesize的作用就是讓編譯器為你自動(dòng)生成setter與getter方法。 @synthesize 還有一個(gè)作用斗这,可以指定與屬性對(duì)應(yīng)的實(shí)例變量动猬,例如@synthesize myButton = xxx;那么self.myButton其實(shí)是操作的實(shí)例變量xxx表箭,而不是_myButton了赁咙。 在實(shí)際的項(xiàng)目中,我們一般這么寫(xiě).m文件 @synthesize myButton; 這樣寫(xiě)了之后,那么編譯器會(huì)自動(dòng)生成myButton的實(shí)例變量彼水,以及相應(yīng)的getter和setter方法崔拥。
注意:_myButton這個(gè)實(shí)例變量是不存在的,因?yàn)樽詣?dòng)生成的實(shí)例變量為myButton而不是_myButton凤覆,所以現(xiàn)在@synthesize的作用就相當(dāng)于指定實(shí)例變量握童;

類(lèi)別中的屬性property

類(lèi)與類(lèi)別中添加的屬性要區(qū)分開(kāi)來(lái),因?yàn)轭?lèi)別中只能添加方法叛赚,不能添加實(shí)例變量澡绩。經(jīng)常會(huì)在ios的代碼中看到在類(lèi)別中添加屬性,這種情況下俺附,是不會(huì)自動(dòng)生成實(shí)例變量的肥卡。比如在:UINavigationController.h文件中會(huì)對(duì)UIViewController類(lèi)進(jìn)行擴(kuò)展
@interface UIViewController (UINavigationControllerItem) @property(nonatomic,readonly,retain) UINavigationItem *navigationItem; @property(nonatomic) BOOL hidesBottomBarWhenPushed; @property(nonatomic,readonly,retain) UINavigationController *navigationController; @end
這里添加的屬性,不會(huì)自動(dòng)生成實(shí)例變量事镣,這里添加的屬性其實(shí)是添加的getter與setter方法步鉴。 注意一點(diǎn),匿名類(lèi)別(匿名擴(kuò)展)是可以添加實(shí)例變量的璃哟,非匿名類(lèi)別是不能添加實(shí)例變量的氛琢,只能添加方法,或者屬性(其實(shí)也是方法)随闪。 成員變量用于類(lèi)內(nèi)部阳似,無(wú)需與外界接觸的變量。 根據(jù)成員變量的私有性铐伴,為了方便訪(fǎng)問(wèn)撮奏,所以就有了屬性變量。屬性變量的好處就是允許讓其他對(duì)象訪(fǎng)問(wèn)到該變量当宴。當(dāng)然畜吊,你可以設(shè)置只讀或者可寫(xiě)等,設(shè)置方法也可自定義户矢。所以玲献,屬性變量是用于與其他對(duì)象交互的變量。 一些建議: 1. 如果只是單純的private變量梯浪,最好聲明在implementation里. 2. 如果是類(lèi)的public屬性捌年,就用property寫(xiě)在.h文件里 3. 如果自己內(nèi)部需要setter和getter來(lái)實(shí)現(xiàn)一些東西,就在.m文件的類(lèi)目里用property來(lái)聲明 .h中的interface的大括號(hào){}之間的實(shí)例變量驱证,.m中可以直接使用延窜; .h中的property變量恋腕,.m中需要使用self.propertyVariable的方式使用propertyVariable變量

實(shí)例

.h中聲明的屬性和成員變量均可以在子類(lèi)中訪(fǎng)問(wèn)到.而.m則不可.
而屬性其實(shí)也就是成員變量的一種簡(jiǎn)寫(xiě),其內(nèi)部自動(dòng)包含了getter和setter方法.
如圖:ViewController是SubController的父類(lèi).在ViewController.h中聲明成員變量imageView1和屬性imageView2(屬性)


在ViewController.m中同樣聲明了成員變量imageView3和屬性imageView4.

在ViewController.m中
1.通過(guò)self.xxx的方法可以出現(xiàn)imageView2和imageView4(屬性)

2.通過(guò) _XXX的形式只能出現(xiàn)imageView2,imageView4(屬性)

3.通過(guò)XXX的形式只能出現(xiàn)imageView1.imageView3(成員變量)
在子類(lèi)SubController.m中
1.通過(guò)self.XXX的形式只能出現(xiàn)imageView2(屬性)

2.通過(guò) _XXX的形式什么都不會(huì)出現(xiàn).

3.通過(guò)XXX的形式可以出現(xiàn)imageView1(成員變量)

開(kāi)發(fā)中(習(xí)慣),一般在成員變量前面加個(gè)_.


這樣一來(lái)就明了了. 1. 在本類(lèi)中訪(fǎng)問(wèn),通過(guò)self.XXX可以訪(fǎng)問(wèn)到imageView2和imageView4. 2. 通過(guò)_XXX都可以訪(fǎng)問(wèn),XXX則都不能. 3. 子類(lèi)中,通過(guò)self.XXX可以訪(fǎng)問(wèn)imageView2,通過(guò)_XXX可以訪(fǎng)問(wèn)到imageView1,XXX則都不能.
總之,差不多就是在.h中聲明的屬性或者成員變量在其子類(lèi)中均可以訪(fǎng)問(wèn)到,只不過(guò)形式不一樣.在.m中聲明的屬性或者成員變量只能在本類(lèi)中訪(fǎng)問(wèn)到.而屬性其實(shí)就是成員變量的簡(jiǎn)寫(xiě),內(nèi)部自動(dòng)包含了getter和setter方法.
參考:
http://www.cnblogs.com/shaoting/p/4990788.html?utm_source=tuicool&utm_medium=referral http://blog.csdn.net/huang2009303513/article/details/38445593

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末抹锄,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌伙单,老刑警劉巖获高,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異吻育,居然都是意外死亡念秧,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)布疼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)摊趾,“玉大人,你說(shuō)我怎么就攤上這事游两±悖” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵贱案,是天一觀的道長(zhǎng)肛炮。 經(jīng)常有香客問(wèn)我,道長(zhǎng)宝踪,這世上最難降的妖魔是什么侨糟? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮瘩燥,結(jié)果婚禮上秕重,老公的妹妹穿的比我還像新娘。我一直安慰自己厉膀,他們只是感情好悲幅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著站蝠,像睡著了一般汰具。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上菱魔,一...
    開(kāi)封第一講書(shū)人閱讀 51,155評(píng)論 1 299
  • 那天留荔,我揣著相機(jī)與錄音,去河邊找鬼澜倦。 笑死聚蝶,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的藻治。 我是一名探鬼主播碘勉,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼桩卵!你這毒婦竟也來(lái)了验靡?” 一聲冷哼從身側(cè)響起倍宾,我...
    開(kāi)封第一講書(shū)人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎胜嗓,沒(méi)想到半個(gè)月后高职,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡辞州,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年怔锌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片变过。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡埃元,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出媚狰,到底是詐尸還是另有隱情亚情,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布哈雏,位于F島的核電站楞件,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏裳瘪。R本人自食惡果不足惜土浸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望彭羹。 院中可真熱鬧黄伊,春花似錦、人聲如沸派殷。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)毡惜。三九已至拓轻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間经伙,已是汗流浹背扶叉。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留帕膜,地道東北人枣氧。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像垮刹,于是被迫代替她去往敵國(guó)和親达吞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

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