iOS中的成員變量和屬性

成員變量和屬性的區(qū)別

一、成員變量

1、概念相關(guān)

成員變量:成員變量,成員變量包含基本數(shù)據(jù)類型的變量和對(duì)象類型的變量(實(shí)例變量)

實(shí)例變量:實(shí)例變量是針對(duì)類而言,是由類聲明的對(duì)象。

2、作用域

變量聲明位置與作用域的關(guān)系

  1. 當(dāng)成員變量聲明在.m文件中時(shí),則只有該文件可以訪問。
  2. 當(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中如下:

圖1,成員變量聲明

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

對(duì)比上圖我們可以得到結(jié)論:
1、修飾詞public、pakage修飾的成員變量可以在外部訪問。

3.2 本類內(nèi)部訪問:

在本類文件訪問截圖:

圖3

結(jié)合圖2和圖3可以得到結(jié)論:
2、修飾詞protected、private修飾的成員變量可以在本類文件中訪問。

3.3 子類外部訪問:

創(chuàng)建ChineseTeacher類繼承自Teacher類,如:

圖4

子類在外部文件訪問:
圖5

結(jié)合圖4和圖5可以得出結(jié)論:
3、子類在外部文件中可以訪問父類中用publick和pakage修飾的成員變量。

3.4 子類內(nèi)部訪問:

在子類.m文件中訪問情況如下:

圖6

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

apple官方給出的說明如下:
apple

二、屬性

1、屬性聲明都默認(rèn)做了些什么?

  1. 聲明屬性時(shí)會(huì)默認(rèn)創(chuàng)建格式如:“_屬性名”的成員變量。
  2. 針對(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)存取方法。

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

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

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