iOS ARC下 weak 和 assign 的區(qū)別

一棒厘、相似

1.都可以修飾對象類型檩互,但是assign修飾對象會存在問題。

2.都是弱引用類蓖柔,不能保住 OC 對象的生命辰企。

二、區(qū)別

1.修飾變量類型的區(qū)別

weak 只可以修飾對象况鸣。如果修飾基本數(shù)據(jù)類型牢贸,編譯器會報錯-“Property with ‘weak’ attribute must be of object type”。

assign 可修飾對象和基本數(shù)據(jù)類型镐捧。

2.是否產(chǎn)生野指針

weak?指向的對象銷毀時潜索,會將當(dāng)前指向?qū)ο蟮闹羔樦赶騨il,防止野指針的生成懂酱。

assign?指向的對象銷毀時竹习,不會將當(dāng)前指向?qū)ο蟮闹羔樦赶騨il,有野指針的生成列牺。


生成用 assign整陌、weak、strong 修飾的三個變量:assignPoint瞎领、weakPonit泌辫、strongPoint;

將 self.strongPoint 賦值給 self.weakPoint 和 self.assignPoint ,然后釋放 self.strongPoint ,那么相應(yīng)的 self.weakPoint 指向的對象就會釋放九默,self.weakPoint 也會將值設(shè)置為nil震放。

而 self.assignPoint 中的引用雖然釋放了,但是值卻還是原來 self.strongPoint 中的值荤西,所以當(dāng)引用的時候就會造成野指針澜搅。


Runtime 如何實現(xiàn) weak 變量的自動置nil伍俘?

Runtime 對注冊的類, 會進(jìn)行布局勉躺,對于 weak 對象會放入一個 hash 表中癌瘾。 用 weak 指向的對象內(nèi)存地址作為 key,當(dāng)此對象的引用計數(shù)為0的時候會 dealloc饵溅,假如 weak 指向的對象內(nèi)存地址是a妨退,那么就會以a為鍵, 在這個 weak 表中搜索蜕企,找到所有以a為鍵的 weak 對象咬荷,從而設(shè)置為 nil。

Runtime 如何實現(xiàn) weak 屬性具體流程大致分為 3 步:

1轻掩、初始化時:runtime 會調(diào)用 objc_initWeak 函數(shù)幸乒,初始化一個新的 weak 指針指向?qū)ο蟮牡刂贰?/p>

2、添加引用時:objc_initWeak 函數(shù)會調(diào)用 objc_storeWeak() 函數(shù)唇牧,objc_storeWeak() 的作用是更新指針指向(指針可能原來指向著其他對象罕扎,這時候需要將該 weak 指針與舊對象解除綁定,會調(diào)用到 weak_unregister_no_lock)丐重,如果指針指向的新對象非空腔召,則創(chuàng)建對應(yīng)的弱引用表,將 weak 指針與新對象進(jìn)行綁定扮惦,會調(diào)用到 weak_register_no_lock臀蛛。在這個過程中,為了防止多線程中競爭沖突崖蜜,會有一些鎖的操作浊仆。

3、釋放時:調(diào)用 clearDeallocating 函數(shù)豫领,clearDeallocating 函數(shù)首先根據(jù)對象地址獲取所有 weak 指針地址的數(shù)組氧卧,然后遍歷這個數(shù)組把其中的數(shù)據(jù)設(shè)為 nil,最后把這個 entry 從 weak 表中刪除氏堤,最后清理對象的記錄。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末搏明,一起剝皮案震驚了整個濱河市鼠锈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌星著,老刑警劉巖购笆,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異虚循,居然都是意外死亡同欠,警方通過查閱死者的電腦和手機(jī)样傍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來铺遂,“玉大人衫哥,你說我怎么就攤上這事〗笕瘢” “怎么了撤逢?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長粮坞。 經(jīng)常有香客問我蚊荣,道長,這世上最難降的妖魔是什么莫杈? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任互例,我火速辦了婚禮,結(jié)果婚禮上筝闹,老公的妹妹穿的比我還像新娘媳叨。我一直安慰自己,他們只是感情好丁存,可當(dāng)我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布肩杈。 她就那樣靜靜地躺著,像睡著了一般解寝。 火紅的嫁衣襯著肌膚如雪扩然。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天聋伦,我揣著相機(jī)與錄音夫偶,去河邊找鬼。 笑死觉增,一個胖子當(dāng)著我的面吹牛兵拢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播逾礁,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼说铃,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了嘹履?” 一聲冷哼從身側(cè)響起腻扇,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎砾嫉,沒想到半個月后幼苛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡焕刮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年舶沿,在試婚紗的時候發(fā)現(xiàn)自己被綠了墙杯。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡括荡,死狀恐怖高镐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情一汽,我是刑警寧澤避消,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站召夹,受9級特大地震影響岩喷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜监憎,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一纱意、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鲸阔,春花似錦偷霉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽焙格。三九已至复唤,卻和暖如春夭问,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背晃痴。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工残吩, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人倘核。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓泣侮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親紧唱。 傳聞我的和親對象是個殘疾皇子活尊,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,527評論 2 349

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

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,092評論 1 32
  • 我個人理解就是:weak比assign多了一個功能就是當(dāng)屬性所指向的對象消失的時候(也就是內(nèi)存引用計數(shù)為0)會自動...
    zhengelababy閱讀 2,095評論 2 3
  • 一個人的前途如何,跟許多因素有關(guān)漏益,但一個人對工作的態(tài)度酬凳,很大程度上決定了他能走多遠(yuǎn)。 一個只計較個人利益的員工沒辦...
    半闕墨香閱讀 173評論 0 5
  • 文/一杯甜酒 前陣子和公子聊天稠屠,聊到素質(zhì)峦睡,兩個人不約而同地開始吐槽生活里碰到的讓我們頭大的人翎苫。什么高鐵上占著你的座...
    一杯甜酒閱讀 1,176評論 0 1
  • 什么是symbolicatecrash symbolicatecrash是Xcode自帶的一個分析工具,可以通過機(jī)...
    Zz7777777閱讀 950評論 0 0