成員變量和屬性的區(qū)別
一、成員變量
1、概念相關(guān)
成員變量:成員變量,成員變量包含基本數(shù)據(jù)類型的變量和對(duì)象類型的變量(實(shí)例變量)
實(shí)例變量:實(shí)例變量是針對(duì)類而言,是由類聲明的對(duì)象。
2、作用域
變量聲明位置與作用域的關(guān)系
- 當(dāng)成員變量聲明在.m文件中時(shí),則只有該文件可以訪問。
- 當(dāng)成員變量聲明在.h文件中時(shí),則其訪問權(quán)限由修飾詞控制。
四種修飾詞對(duì)成員變量作用域的影響具體如下:
- package
整個(gè)包中,整個(gè)項(xiàng)目中都可以訪問 - private
只有在當(dāng)前文件中才能訪問 - protected
只有在當(dāng)前類或者子類文件中訪問 - public
整個(gè)項(xiàng)目中都可以訪問
3、驗(yàn)證
所謂實(shí)踐是檢驗(yàn)真理的唯一標(biāo)準(zhǔn),這里我們只驗(yàn)證成員變量聲明在.h文件中的情況,至于聲明在.m中的情況,大家自行探索。
3.1 本類外部訪問:
創(chuàng)建類Teacher,成員變量聲明在Teacher.h中如下:

下面我們來看該類在外部文件對(duì)這四個(gè)變量的訪問情況,如圖:

對(duì)比上圖我們可以得到結(jié)論:
1、修飾詞public、pakage修飾的成員變量可以在外部訪問。
3.2 本類內(nèi)部訪問:
在本類文件訪問截圖:

結(jié)合圖2和圖3可以得到結(jié)論:
2、修飾詞protected、private修飾的成員變量可以在本類文件中訪問。
3.3 子類外部訪問:
創(chuàng)建ChineseTeacher類繼承自Teacher類,如:

子類在外部文件訪問:

結(jié)合圖4和圖5可以得出結(jié)論:
3、子類在外部文件中可以訪問父類中用publick和pakage修飾的成員變量。
3.4 子類內(nèi)部訪問:
在子類.m文件中訪問情況如下:

結(jié)合圖6和圖3可以得到:
4、修飾詞protected允許本類以及子類文件中訪問,private修飾的成員變量只有在本類文件中能訪問,子類無法訪問。
apple官方給出的說明如下:

二、屬性
1、屬性聲明都默認(rèn)做了些什么?
- 聲明屬性時(shí)會(huì)默認(rèn)創(chuàng)建格式如:“_屬性名”的成員變量。
- 針對(duì)屬性自動(dòng)生成setter和getter方法存取器。
2、屬性的內(nèi)存管理
assign :直接進(jìn)行賦值操作
assign一般用于修飾基本數(shù)據(jù)類型,也可以修飾對(duì)象,但不推薦,assign修飾的對(duì)象在釋放之后指針依舊會(huì)指向釋放前的內(nèi)存,在后續(xù)操作中可能會(huì)導(dǎo)致內(nèi)存問題崩潰。-
retain:release舊值,再retain新值
retain和strong一樣,都用于修飾oc對(duì)象.在set方法中的內(nèi)部實(shí)現(xiàn)實(shí)質(zhì)上是保留新值,釋放舊值,再設(shè)置新值。避免新舊值一樣時(shí)引起對(duì)象被釋放的問題。下面圖1和圖2分別對(duì)象ARC和MRC時(shí)set方法。
圖1
圖2 strong:ARC中引入的新的修飾詞,具體可參照retain。
-
copy:release舊值,copy新值(拷貝內(nèi)容)
一般用于修飾String、Dic、Array等需要保護(hù)封裝性的對(duì)象,尤其是在內(nèi)容可變時(shí)。采用copy進(jìn)行深拷貝可以有效避免對(duì)源內(nèi)容的篡改。在set方法中實(shí)質(zhì)是先拷貝新值,再釋放舊值,再設(shè)置新值。下面圖3和圖4分別對(duì)應(yīng)ARC和MRC時(shí)set方法。
圖3
圖4
2.1 @synthesize與@dynamic
現(xiàn)在聲明屬性之后,系統(tǒng)默認(rèn)會(huì)自動(dòng)生成屬性的setter和getter存取方法。比如:當(dāng)你在.h文件聲明了屬性:
@property (nonatomic,copy) NSString *name;
那么我們到.m文件中可以發(fā)現(xiàn)我們可以使用_name對(duì)屬性name進(jìn)行訪問。其實(shí)這個(gè)_name是我們聲明屬性之后系統(tǒng)默認(rèn)創(chuàng)建的。系統(tǒng)默認(rèn)做了這樣幾件事:
- 1.按照對(duì)應(yīng)格式:
@property x ==> _x
生成與屬性一一對(duì)應(yīng)的成員變量,并且將屬性與該成員變量綁定。
- 2.自動(dòng)合成操作屬性setter和getter方法,實(shí)表面我們操作的是屬性,實(shí)際上操作與屬性綁定的成員變量。
以上兩點(diǎn)在屬性聲明之后系統(tǒng)的初始化操作。其實(shí)我們可以借助關(guān)鍵字synthesize和dynamic對(duì)上面兩點(diǎn)進(jìn)行控制。我們先看看@synthesize和@dynamic的作用:
@synthesize
1、讓編譯器自動(dòng)生成屬性的存取方法,并將存取方法作用于系統(tǒng)根據(jù)屬性名創(chuàng)建的(_+屬性名)變量。
2、當(dāng)我們自定義存取方法時(shí)可以覆蓋系統(tǒng)自動(dòng)生成的存取方法。(注意當(dāng)我們重寫set和get方法時(shí)系統(tǒng)不會(huì)自動(dòng)創(chuàng)建1中提到的變量,這時(shí)需要我們自己聲明實(shí)例變量)@dynamic
告訴編譯器不自動(dòng)生成存取方法,由開發(fā)者自行實(shí)現(xiàn)存取方法。



