weak指針指向stackBlock并不會隨stackBlock被回收而指向nil

· 前言

無意中寫的demo遇到了這個問題,引出了block的三種類型以及編譯器在ARC環(huán)境下對block進行優(yōu)化的知識點庆捺,讓自己對block以及ARC的內(nèi)存管理有了更深刻的印象,特此寫下來給需要幫助的iOSCoder

· 問題描述

如下所示,在一個UIButton中,我用了一個weak指針和一個strong指針接收一個block眶痰,在clickActionHandle方法執(zhí)行block之前,將strong指針置為nil梯啤。

理想情況:隨著strong指針的銷毀竖伯,weak指針也會隨之置為nil而不執(zhí)行block。

實際情況:weakCCBack發(fā)生壞內(nèi)存訪問崩潰

#import "CallBackButton.h"

@interface CallBackButton ()

@property (nonatomic,weak) void(^weakCCBack)(void);

@property (nonatomic,strong) void(^strongCCBack)(void);

@end

@implementation CallBackButton

-(instancetype)initWithCallBack:(void(^)(void))callBack{
    if (self = [super init]) {
        self.strongCCBack = callBack;
        self.weakCCBack = callBack;
        NSLog(@"self.strongCCBack = %@ self.weakCCBack =%@",self.strongCCBack,self.weakCCBack);
        [self addTarget:self action:@selector(clickActionHandle) forControlEvents:UIControlEventTouchUpInside];
    }
    return self;
}

-(void)clickActionHandle{
    self.strongCCBack = nil;
    if (self.weakCCBack != nil) {
        self.weakCCBack();
        self.strongCCBack = nil;
    }
}

· 原因解釋

同時用一個weak指針和一個strong指針指向init方法傳過來的block時因宇,當strong指針置為nil后七婴,weak指針沒有自動置為nil導(dǎo)致執(zhí)行clickActionHandle方法時,發(fā)生了壞內(nèi)存訪問的錯誤察滑。打印了兩個指針的地址才發(fā)現(xiàn)時ARC對block的賦值進行了優(yōu)化打厘。

self.strongCCBack = <__NSMallocBlock__: 0x600002617b40>
 self.weakCCBack =<__NSStackBlock__: 0x7ffee6405200>
callBack = <__NSStackBlock__: 0x7ffee6405200>

·使用strong指針接收棧類型的block,編譯器會將棧block進行一次拷貝操作生成一個新的堆Block保存在strong指針中贺辰。這么做的原因很容易理解:因為存儲在棧中的值出了作用域以后會被系統(tǒng)自動回收户盯,而block是一個等待著被執(zhí)行的代碼塊嵌施,如果init方法結(jié)束后參數(shù)中的block(此block為棧block)會被立即回收,那么在執(zhí)行block的時候會發(fā)生壞內(nèi)存訪問的情況莽鸭,為了保證安全執(zhí)行block吗伤,strong指針指向stackBlock(棧)的時候會生成一個mallocBlock(堆)副本,以確保能安全執(zhí)行block硫眨。
·而使用weak指針指向棧block時足淆,編譯器未做任何優(yōu)化,即便棧block被回收礁阁,weak指針也不會指向nil巧号,繼而導(dǎo)致執(zhí)行block的時候會產(chǎn)生壞內(nèi)存訪問。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末氮兵,一起剝皮案震驚了整個濱河市裂逐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌泣栈,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件弥姻,死亡現(xiàn)場離奇詭異南片,居然都是意外死亡,警方通過查閱死者的電腦和手機庭敦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門疼进,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人秧廉,你說我怎么就攤上這事伞广。” “怎么了疼电?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵嚼锄,是天一觀的道長。 經(jīng)常有香客問我蔽豺,道長区丑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任修陡,我火速辦了婚禮沧侥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘魄鸦。我一直安慰自己宴杀,他們只是感情好,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布拾因。 她就那樣靜靜地躺著旺罢,像睡著了一般旷余。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上主经,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天荣暮,我揣著相機與錄音,去河邊找鬼罩驻。 笑死穗酥,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的惠遏。 我是一名探鬼主播砾跃,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼节吮!你這毒婦竟也來了抽高?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤透绩,失蹤者是張志新(化名)和其女友劉穎翘骂,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體帚豪,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡碳竟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了狸臣。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片莹桅。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖烛亦,靈堂內(nèi)的尸體忽然破棺而出诈泼,到底是詐尸還是另有隱情,我是刑警寧澤煤禽,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布铐达,位于F島的核電站,受9級特大地震影響呜师,放射性物質(zhì)發(fā)生泄漏娶桦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一汁汗、第九天 我趴在偏房一處隱蔽的房頂上張望衷畦。 院中可真熱鬧,春花似錦知牌、人聲如沸祈争。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽菩混。三九已至忿墅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間沮峡,已是汗流浹背疚脐。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留邢疙,地道東北人棍弄。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像疟游,于是被迫代替她去往敵國和親呼畸。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

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

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,097評論 1 32
  • 面試題參考1 : 面試題[http://www.cocoachina.com/ios/20150803/12872...
    江河_ios閱讀 1,735評論 0 4
  • 作者:書豪哥 在兩次世界大戰(zhàn)的30年中颁虐,美國靠隔岸觀火蛮原,坐收漁利,不但贏得了戰(zhàn)爭另绩,而且發(fā)了戰(zhàn)爭財儒陨,全世界三分之二的...
    包書豪閱讀 490評論 0 1
  • 可能不怎么好框全,但也在思考 在跑步機上跑步的時候,除了胡思亂想干签、聽音樂以及看著窗外風景發(fā)呆等好多隨心情的事情外,里面...
    植尚淇閱讀 466評論 4 6
  • 我愛你 像手邊的玫瑰 我不愛你 像水面的皓月
    我的墨閱讀 120評論 0 0