iOS-底層原理 10:strong&copy&weak底層分析 以及 方法簽名和attribute簡(jiǎn)寫含義

iOS 底層原理 文章匯總

在clang編譯的cpp文件中可以發(fā)現(xiàn) strong & copy & weak 修飾的屬性在編譯的底層代碼中是有區(qū)別的

strong & copy & weak 底層分析

  • 在LGPerson中我們定義了兩個(gè)兩個(gè)屬性倒堕,分別用copy和strong修飾


    定義類
  • clangmain.m文件編譯成main.cpp,然后發(fā)現(xiàn)copy 和strong修飾的屬性的set方法是有區(qū)別的

    clang編譯后的屬性的set唱矛、get方法

這里就有疑問了,為什么copy修飾的屬性使用了objc_setProperty联予,而strong修飾的沒有徘跪?

  • 在LLVM中搜索”objc_setProperty模软,找到如下所示的getOptimizedSetPropertyFn方法中

    objc_setProperty底層編譯

    從這里即可看出雁仲,針對(duì)不同的修飾符疗我,返回的那么是不同的

  • 如果是atomic & copy修飾咆畏,name為objc_setProperty_atomic_copy

  • 如果是atomic 且沒有copy修飾,name為 objc_setProperty_atomic

  • 如果是nonatomic & copy 修飾吴裤,name為 objc_setProperty_nonatomic_copy

  • 其他剩余的組合旧找,即nonatomic、nonatomic & strong麦牺、nonatomic & weak等钮蛛,name為objc_setProperty_nonatomic

上述的幾個(gè)name分別對(duì)應(yīng)objc-781源碼中的如下方法


對(duì)應(yīng)的objc-781源碼

然后通過匯編調(diào)試發(fā)現(xiàn),最終都會(huì)走到objc_storeStrong

  • copy修飾的屬性匯編調(diào)試結(jié)果


    copy匯編調(diào)試
  • strong修飾的屬性匯編調(diào)試結(jié)果


    strong匯編調(diào)試
  • 源碼中搜索objc_storeStrong剖膳,有如下源碼魏颓,主要也是retain新值,release舊值

void
objc_storeStrong(id *location, id obj)
{
    id prev = *location;
    if (obj == prev) {
        return;
    }
    objc_retain(obj);//retain新值
    *location = obj;
    objc_release(prev);//release舊值
}
  • llvm編譯源碼中搜索objc_storeStrong吱晒,找到EmitARCStoreStrongCall方法甸饱,如下圖所示,發(fā)現(xiàn)copy 和 strong修飾的屬性執(zhí)行的策略是不一致的

    EmitARCStoreStrongCall底層

  • llvm中搜索EmitARCStoreStrongCall方法仑濒,在GenerateCopyHelperFunction方法有調(diào)用叹话,然后在這里發(fā)現(xiàn)了strong 和 weak的不同處理

    GenerateCopyHelperFunction底層編譯

    其中BlockCaptureEntityKind有如下的枚舉值以及表示的含義
    BlockCaptureEntityKind枚舉值

    • 如果是weak修飾,執(zhí)行EmitARCCopyWeak方法墩瞳,如下所示驼壶,weak在底層的調(diào)用是 objc_initWeak

      EmitARCCopyWeak底層編譯

    • 如果是strong修飾,執(zhí)行EmitARCStoreStrongCall方法

結(jié)論

  • copystrong修飾的屬性在底層編譯的不一致喉酌,主要還是llvm中對(duì)其進(jìn)行了不同的處理的結(jié)果热凹。copy的賦值是通過objc_setProperty,而strong的賦值時(shí)通過self + 內(nèi)存平移(即將指針通過平移移至name所在的位置泪电,然后賦值)般妙,然后還原成 strong類型

  • strong & copy 在底層調(diào)用objc_storeStrong,本質(zhì)是新值retain歪架,舊值release

  • weak 在底層調(diào)用objc_initWeak

補(bǔ)充知識(shí): Type Encoding & Property Type String

Type Encoding-官方文檔

Property Type String-官方文檔

clang中的方法簽名

Type encoding

clang中編譯后股冗,方法列表的這些字符的含義是什么


clang編譯后的方法列表

@16@0:8為例

  • @16表示返回字符串占用16個(gè)字節(jié) -- 第二個(gè)@8字節(jié), sel8字節(jié)
    • 第一個(gè)@ 表示 返回值
    • 16 表示 總共占用的字節(jié)數(shù)16字節(jié)
    • 第二個(gè)@:第一個(gè)參數(shù)
      • id -- @ 統(tǒng)配類型
      • typedef struct objc_object *id
    • 0 -- 從0開始 0-8
    • : -- 代表sel和蚪,方法編號(hào)
    • 8 -- 8-16
  • 而v24@0:8@16中的 v -- void 無返回值

更多的可以查看官網(wǎng)的以下列表


Type encoding表

clang編譯后的屬性的attribute

clang編譯輸出了屬性的attribute 止状,同樣也可以通過property_getAttributes方法獲取

clang編譯后的attribute

  • T 表示 type
  • @ 表示 變量類型
  • C 表示 copy
  • N 表示 nonatomic
  • V 表示 variable 變量,即下劃線變量 _nickName

更多的可以查看官網(wǎng)的以下列表


property type string表
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末攒霹,一起剝皮案震驚了整個(gè)濱河市怯疤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌催束,老刑警劉巖集峦,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡塔淤,警方通過查閱死者的電腦和手機(jī)摘昌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來高蜂,“玉大人聪黎,你說我怎么就攤上這事”感簦” “怎么了稿饰?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)露泊。 經(jīng)常有香客問我喉镰,道長(zhǎng),這世上最難降的妖魔是什么惭笑? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任侣姆,我火速辦了婚禮,結(jié)果婚禮上脖咐,老公的妹妹穿的比我還像新娘铺敌。我一直安慰自己,他們只是感情好屁擅,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布偿凭。 她就那樣靜靜地躺著,像睡著了一般派歌。 火紅的嫁衣襯著肌膚如雪弯囊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天胶果,我揣著相機(jī)與錄音匾嘱,去河邊找鬼。 笑死早抠,一個(gè)胖子當(dāng)著我的面吹牛霎烙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蕊连,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼悬垃,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了甘苍?” 一聲冷哼從身側(cè)響起尝蠕,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎载庭,沒想到半個(gè)月后看彼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體廊佩,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年靖榕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了标锄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡序矩,死狀恐怖鸯绿,靈堂內(nèi)的尸體忽然破棺而出跋破,到底是詐尸還是另有隱情簸淀,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布毒返,位于F島的核電站租幕,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏拧簸。R本人自食惡果不足惜劲绪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望盆赤。 院中可真熱鬧贾富,春花似錦、人聲如沸牺六。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)淑际。三九已至畏纲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間春缕,已是汗流浹背盗胀。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留锄贼,地道東北人票灰。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像宅荤,于是被迫代替她去往敵國(guó)和親屑迂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345