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é)果。