Weak相關(guān)

整理一下自己學(xué)到的知識克蚂,方便以后查看

1.什么情況使用 weak 關(guān)鍵字鸭巴,相比 assign 有什么不同吗货?

1.在ARC中,在有可能出現(xiàn)循環(huán)引用的時候,往往要通過讓其中一端使用weak來解決,比如:delegate代理屬性
2.自身已經(jīng)對它進(jìn)行一次強引用,沒有必要再強引用一次,此時也會使用weak,自定義IBOutlet控件屬性一般也使用weak字逗;當(dāng)然急前,也可以使用strong醒陆。(IBOutlet本身有一個強引用)

不同點:

1)weak 此特質(zhì)表明該屬性定義了一種“非擁有關(guān)系” (nonowning relationship)。為這種屬性設(shè)置新值時裆针,設(shè)置方法既不保留新值刨摩,也不釋放舊值。此特質(zhì)同assign類似世吨, 然而在屬性所指的對象遭到摧毀時澡刹,屬性值也會清空(nil)。 而 assign 的“設(shè)置方法”只會執(zhí)行針對“純量類型” (scalar type耘婚,例如 CGFloat 或 NSlnteger 等)的簡單賦值操作罢浇。
2)assigin 可以用非OC對象,而weak必須用于OC對象

weak修飾的屬性可以在ARC自動置為nil的原理

系統(tǒng)有一個SideTables的哈希表,用來管理所有對象的引用計數(shù)以及weak指針沐祷。

struct SideTable {
    spinlock_t slock;
    RefcountMap refcnts; // 引用計數(shù) 
    weak_table_t weak_table; // 弱引用表 嚷闭,weak_table_t是保存weak指針的
}

weak_table_t的結(jié)構(gòu)體

struct weak_table_t {
    weak_entry_t *weak_entries;
    size_t    num_entries;
};

typedef DisguisedPtr<objc_object *> weak_referrer_t;
#define WEAK_INLINE_COUNT 4
struct weak_entry_t {// 本來是一個C++結(jié)構(gòu)體, 簡化后如下
    DisguisedPtr<objc_object> referent;
    weak_referrer_t *referrers;
    weak_referrer_t  inline_referrers[WEAK_INLINE_COUNT]; 
};

1.inline_referrers是用來存放weak指針的數(shù)組,最大可以裝4個赖临,如果超過了胞锰,就用referrers繼續(xù)儲存;
2.referent是用來儲存對象的的地址的兢榨。

對象銷毀時發(fā)生的事:
1.dealoc
2._objc_rootDealloc(self);
3.obj->rootDealloc();
4.object_dispose(this);
5.objc_destructInstance(obj);
6.clearDeallocating函數(shù)里面會調(diào)用clearDeallocating_slow();
7.clearDeallocating_slow();里面會調(diào)用weak_clear_no_lock(&table.weak_table, (id)this); 嗅榕。
8.weak_clear_no_lock函數(shù)中將referrers數(shù)組或者inline_referrers數(shù)組遍歷,賦值為nil色乾。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末誊册,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子暖璧,更是在濱河造成了極大的恐慌,老刑警劉巖君旦,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件澎办,死亡現(xiàn)場離奇詭異,居然都是意外死亡金砍,警方通過查閱死者的電腦和手機局蚀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來恕稠,“玉大人琅绅,你說我怎么就攤上這事《煳。” “怎么了千扶?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵料祠,是天一觀的道長。 經(jīng)常有香客問我澎羞,道長髓绽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任妆绞,我火速辦了婚禮顺呕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘括饶。我一直安慰自己株茶,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布图焰。 她就那樣靜靜地躺著启盛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪楞泼。 梳的紋絲不亂的頭發(fā)上驰徊,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天,我揣著相機與錄音堕阔,去河邊找鬼棍厂。 笑死,一個胖子當(dāng)著我的面吹牛超陆,可吹牛的內(nèi)容都是我干的牺弹。 我是一名探鬼主播,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼时呀,長吁一口氣:“原來是場噩夢啊……” “哼张漂!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起谨娜,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤航攒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后趴梢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體漠畜,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年坞靶,在試婚紗的時候發(fā)現(xiàn)自己被綠了憔狞。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡彰阴,死狀恐怖瘾敢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤簇抵,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布庆杜,位于F島的核電站,受9級特大地震影響正压,放射性物質(zhì)發(fā)生泄漏欣福。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一焦履、第九天 我趴在偏房一處隱蔽的房頂上張望拓劝。 院中可真熱鬧,春花似錦嘉裤、人聲如沸郑临。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽厢洞。三九已至,卻和暖如春典奉,著一層夾襖步出監(jiān)牢的瞬間躺翻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工卫玖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留公你,地道東北人。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓假瞬,卻偏偏與公主長得像陕靠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子脱茉,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,562評論 2 349

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