第二十八篇: Swift屬性

函數(shù)內聯(lián)

函數(shù)內聯(lián)是一種編譯器技術優(yōu)化,它通過使用方法的內容替換直接調用該方法,從而優(yōu)化性能皂甘。
1)將確保有時內聯(lián)函數(shù)。它是默認行為悼凑,我們無需執(zhí)行任何操作偿枕,Swift編譯器可能會自動內聯(lián)函數(shù)作為優(yōu)化。
2)always - 將確保始終內聯(lián)函數(shù)户辫。通過在函數(shù)前添加@inline(__always),來實現(xiàn)此行為
3)never - 將確保永遠不會內聯(lián)函數(shù)渐夸。這可以通過在函數(shù)前添加@inline(never)來實現(xiàn)。
4)如果函數(shù)很長并且想避免增加代碼段大小渔欢,請使用@inline(never)

如果對象只在聲明的文件中可見墓塌,可以用 private 或 fileprivate進行修飾。編譯器會對private或fileprivate對象進行檢查,確保沒有其他繼承關系的情形下桃纯,自動打上final標記酷誓,進而使得對象獲得靜態(tài)派發(fā)的特性(fileprivate:只允許在定義的源文件中訪問,private:定義的聲明中訪問 )

存儲屬性

存儲屬性是一個作為特定類和結構實例一部分的常量或變量态坦。存儲屬性要么是變量存儲屬性(由var關鍵字引入)要么是常量存儲屬性(由let關鍵字引入)盐数。

let用來聲明常量,常量的值一旦設置好便不能再被更改伞梯;
var用來聲明變量玫氢,變量的值可以在將來設置為不同的值。

如果在struct里有l(wèi)et age和var name谜诫,這age和name都是不可以被修改的漾峡。在class里有l(wèi)et age和var name,這個age是不可以修改喻旷,但是name用var定義的是可以修改的生逸。

我們通過sil查看let和var區(qū)別:var和let都是hasStorage存儲屬性,var有get和set且预,但是let只有get槽袄。

8081670237471_.pic.jpg

計算屬性

計算屬性并不存儲值,他們提供getter和setter來修改和獲取值锋谐,對于存儲屬性來說可以是常量或變量遍尺,但計算屬性必須定義為變量。與此同時我們書寫計算屬性時候必須包含類型涮拗,因為編譯器需要知道期望返回值是什么乾戏。

8091670238050_.pic.jpg

屬性觀察者

屬性觀察者會觀察用來觀察屬性值的變化,一個willset當屬性將被改變調用三热,即使這個值與原有的值相同鼓择,而didset在屬性已經(jīng)改變之后調用。他們的語法類似于getter和setter就漾。

8111670244126_.pic.jpg
8101670243296_.pic.jpg

這里我們在使用屬性觀察器的時候惯退,需要注意的一點是在初始化期間設置屬性時不會調用willset和didset觀察者;只有在完全初始化的實例分配新值時才會調用它們从藤。

下面圖中willset和didset是不會調用的催跪,因為在init中。

8121670247469_.pic.jpg

如果有父類的話夷野,其調用順序為 override willset --> wiliest --> 賦值 --> didst --> override didset

延遲存儲屬性

1)延遲存儲屬性的初始值在其第一次使用時才進行計算懊蒸。
2)用關鍵字lazy來標識一個延遲存儲屬性。

通過下面可以看出悯搔,在沒有使用到age時候其地址為0x000000000000骑丸,當被使用的時候其地址值為0x000000000012,第一次使用才加載。

8131670251238_.pic.jpg
8141670251455_.pic.jpg

類型屬性static

1)類型屬性其實就是一個全局變量
2)類型屬性只會被初始化一次

8171670295786_.pic.jpg
8161670295553_.pic.jpg

Swift里的單例的寫法

在這里用到的是static let去定義通危,但是只有這個是不行的铸豁,需要加個private init(){}


8181670296004_.pic.jpg

屬性在Mahco文件的位置信息

Metadata 的元數(shù)據(jù)結構,如下:

8201670297453_.pic.jpg

之前在方法調度的過程中我們認識了typeDescriptor菊碟,這里面記錄了V-table的相關信息节芥,接下來我們需要認識一下typeDescriptor中的fieldDescripto。

8221670298380_.pic.jpg

fieldDescriptor記錄了當前的屬性信息逆害,其中fieldDescriptor在源碼中的結構如下:

8231670298549_.pic.jpg

其中NumFields代表當前有多少個屬性头镊,F(xiàn)ieldRecords記錄了每個屬性的信息,F(xiàn)ieldRecords的結構體如下:

8241670298645_.pic.jpg
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末魄幕,一起剝皮案震驚了整個濱河市相艇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌纯陨,老刑警劉巖坛芽,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異翼抠,居然都是意外死亡咙轩,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進店門机久,熙熙樓的掌柜王于貴愁眉苦臉地迎上來臭墨,“玉大人赔嚎,你說我怎么就攤上這事膘盖。” “怎么了尤误?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵侠畔,是天一觀的道長。 經(jīng)常有香客問我损晤,道長软棺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任尤勋,我火速辦了婚禮喘落,結果婚禮上,老公的妹妹穿的比我還像新娘最冰。我一直安慰自己瘦棋,他們只是感情好,可當我...
    茶點故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布暖哨。 她就那樣靜靜地躺著赌朋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上沛慢,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天赡若,我揣著相機與錄音,去河邊找鬼团甲。 笑死逾冬,一個胖子當著我的面吹牛,可吹牛的內容都是我干的伐庭。 我是一名探鬼主播粉渠,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼霸株!你這毒婦竟也來了去件?” 一聲冷哼從身側響起尤溜,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤哩罪,失蹤者是張志新(化名)和其女友劉穎碘耳,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體斗搞,經(jīng)...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年澡屡,在試婚紗的時候發(fā)現(xiàn)自己被綠了驶鹉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,912評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡屡律,死狀恐怖搏讶,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情来庭,我是刑警寧澤月弛,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站叁鉴,受9級特大地震影響土涝,放射性物質發(fā)生泄漏。R本人自食惡果不足惜但壮,卻給世界環(huán)境...
    茶點故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蜡饵。 院中可真熱鬧溯祸,春花似錦椿胯、人聲如沸哩盲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至苗傅,卻和暖如春抒线,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背渣慕。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工十兢, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人摇庙。 一個月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓旱物,卻偏偏與公主長得像,于是被迫代替她去往敵國和親卫袒。 傳聞我的和親對象是個殘疾皇子宵呛,可洞房花燭夜當晚...
    茶點故事閱讀 45,922評論 2 361

推薦閱讀更多精彩內容