runtime如何實(shí)現(xiàn)weak

runtime 對(duì)注冊(cè)的類(lèi), 會(huì)進(jìn)行布局,對(duì)于 weak 對(duì)象會(huì)放入一個(gè) hash 表中。 用 weak 指向的對(duì)象內(nèi)存地址作為 key,當(dāng)此對(duì)象的引用計(jì)數(shù)為0的時(shí)候會(huì) dealloc,假如 weak 指向的對(duì)象內(nèi)存地址是a,那么就會(huì)以a為鍵, 在這個(gè) weak 表中搜索,找到所有以a為鍵的 weak 對(duì)象,從而設(shè)置為 nil。

運(yùn)行期系統(tǒng)會(huì)將每一個(gè)類(lèi)的weak變量放入相應(yīng)的一個(gè)hash表中,在這個(gè)表中以weak變量所指向的對(duì)象的內(nèi)存地址為key,當(dāng)weak指向的對(duì)象引用計(jì)數(shù)為0執(zhí)行dealloc方法,對(duì)象被銷(xiāo)毀,運(yùn)行期系統(tǒng)通過(guò)key去hash表中找到相應(yīng)的weak對(duì)象將他們?cè)O(shè)置成nil。

關(guān)于hash表的補(bǔ)充:

* Objective-C中的字典N(xiāo)SDictionary底層其實(shí)是一個(gè)哈希表,實(shí)際上絕大多數(shù)語(yǔ)言中字典都是通過(guò)哈希表實(shí)現(xiàn)。

* Objective-C的實(shí)現(xiàn)和Java比較類(lèi)似,當(dāng)我們需要重寫(xiě)isEqual()方法時(shí),還需要重寫(xiě)hash方法。這兩種語(yǔ)言并沒(méi)有提供一個(gè)通用的、默認(rèn)的哈希函數(shù),主要是考慮到isEqual()方法可能會(huì)被重寫(xiě),兩個(gè)內(nèi)存數(shù)據(jù)不同的對(duì)象可能在語(yǔ)義上被認(rèn)為是相同的。如果使用默認(rèn)的哈希函數(shù)就會(huì)得到不同的哈希值,這兩個(gè)對(duì)象就會(huì)同時(shí)被添加到NSSet集合中,這可能違背我們的期望結(jié)果。

《招聘一個(gè)靠譜的iOS》面試題參考答案

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 要實(shí)現(xiàn)weak屬性,首先要搞清楚weak屬性的特點(diǎn): weak 此特質(zhì)表明該屬性定義了一種“非擁有關(guān)系” (non...
    SessionSinGod閱讀 1,337評(píng)論 0 2
  • 要實(shí)現(xiàn) weak 屬性,首先要搞清楚 weak 屬性的特點(diǎn): weak 此特質(zhì)表明該屬性定義了一種“非擁有關(guān)系” ...
    狗狗臭雞蛋閱讀 851評(píng)論 1 0
  • weak 此特質(zhì)表明該屬性定義了一種“非擁有關(guān)系” (nonowning relationship)。為這種屬性設(shè)...
    星捷閱讀 281評(píng)論 0 0
  • runtime對(duì)注冊(cè)的類(lèi),會(huì)進(jìn)行布局,對(duì)于weak對(duì)象會(huì)放入一個(gè)hash表中,用weak指向的對(duì)象內(nèi)存地址作為ke...
    RFeng閱讀 375評(píng)論 0 1
  • 原來(lái)我家孩子不喜歡和別的小朋友玩。就是一個(gè)人獨(dú)自玩,但今天晚上一直在問(wèn)我:“媽媽?zhuān)∨笥褌?,怎么還不來(lái)呀?” 孩子...
    我心我愿秀閱讀 212評(píng)論 0 2