【iOS 開發(fā)】為什么要用copy修飾Block

引用別人十個字對棧和堆的總結(jié)

棧是吃了吐 堆是吃了拉

下面進入主題為什么要用copy去修飾block呢

個人理解:默認情況下,block會存檔在棧中(棧是吃了吐)褂萧,所以block會在函數(shù)調(diào)用結(jié)束被銷毀,在調(diào)用會報空指針異常祟蚀,如果用copy修飾的話咏花,可以使其保存在堆區(qū)(堆是吃了拉) 矗蕊,它的生命周期會隨著對象的銷毀而結(jié)束的。只要對象不銷毀杠河,我們就可以調(diào)用在堆中的block碌尔。

在了解block為什么要用copy之前浇辜,我們要先了解block的三種類型
NSGlobalBlock:全局的靜態(tài)block 沒有訪問外部變量 你的block類型就是這種類型(也就是說你的block沒有調(diào)用其他外部變量)
NSStackBlock:保存在棧中的block,沒有用copy去修飾并且訪問了外部變量唾戚,你的block類型就是這種類型柳洋,會在函數(shù)調(diào)用結(jié)束被銷毀 (需要在MRC)
NSMallocBlock 保存在堆中的block 此類型blcok是用copy修飾出來的block 它會隨著對象的銷毀而銷毀,只要對象不銷毀叹坦,我們就可以調(diào)用的到在堆中的block熊镣。

下面代碼演示

第一種全局的block 這種block不訪問外部的變量,我們在開發(fā)中block都會訪問外部的變量募书,所以這種block開發(fā)不會用到绪囱,作為一個了解

void(^testOneBlock)() = ^(){
        NSLog(@"我是全局的block");
    };
    NSLog(@"testOneBlock=%@",testOneBlock);
  //控制臺輸出
  2017-06-10 09:45:09.767 ReactiveCocoa[871:14517] 
  testOneBlock=<__NSGlobalBlock__: 0x1045982d0>//全局block  他會隨程序銷毀而銷毀

第二種棧區(qū)block 這種block訪問外部變量,我們重點了解的是第二種和第三種莹捡,但是必須要在MRC的模式下控制臺才會輸出NSStackBlock類型
如何把當前類改為MRC:Build phases -> Compile Sources -> 雙擊當前類會彈出輸入框 -> 把-fno-objc-arc復(fù)制粘貼進去 -> OK

   //需要MRC模式
    int a = 5;
    void(^testTwoBlock)() = ^(){
        NSLog(@"%d",a);
    };
    NSLog(@"testTwoBlock=%@",testTwoBlock);
    //控制臺輸出
    2017-06-10 09:45:09.768 ReactiveCocoa[871:14517]
    testTwoBlock=    <__NSStackBlock__: 0x7fff5b668770>//棧區(qū)block 函數(shù)調(diào)用完畢就會銷毀
    [testTwoBlock copy] 這樣操作就會變成堆區(qū)block

第三種堆區(qū)block 這種block是用copy去修飾的 它的生命周期會隨對象銷毀而銷毀

int a = 5;
self.block1 = ^(NSString *str, UIColor *color){
        NSLog(@"%d",a);
    };
    NSLog(@"block1=%@",self.block1);
//控制臺輸出
2017-06-10 10:02:35.107 ReactiveCocoa[1075:19674] block1=<__NSMallocBlock__: 0x60000004ee50>//用copy修飾的不會函數(shù)調(diào)用完就結(jié)束鬼吵,隨對象銷毀才銷毀 這種是在開發(fā)中正確使用block的姿勢

第三種block在有些情況下會造成block的循環(huán)引用,我會寫在下一篇文章中

寫簡書只是當作筆記來寫篮赢,如果那里使用的姿勢不正確呢齿椅,歡迎大神來教導(dǎo)正確姿勢
(我是一個小菜逼,沒事就是愛裝逼)沒有特別的意思 純屬覺得順口启泣。辛苦啦都看完啦

最后編輯于
?著作權(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)容

  • 前言 Blocks是C語言的擴充功能志电,而Apple 在OS X Snow Leopard 和 iOS 4中引入了這...
    小人不才閱讀 3,768評論 0 23
  • 《Objective-C高級編程》這本書就講了三個東西:自動引用計數(shù)、block蛔趴、GCD挑辆,偏向于從原理上對這些內(nèi)容...
    WeiHing閱讀 9,810評論 10 69
  • 本篇文章并不會剖析block的原理,筆者對原理也不甚了解孝情。 聲明:對某個屬性的訪問(access)包括getter...
    VV木公子閱讀 1,102評論 1 18
  • Block 梳理與疑問 時隔一年鱼蝉,再次讀 《Objective-C 高級編程》,看到 block 一章箫荡,這一次從頭...
    DeerRun閱讀 632評論 0 2
  • 娃爸發(fā)現(xiàn)家邊上新開了家拉面館蚀乔,看他的意思好像很想吃。我掂量了一下吃了一上午茶點的肚子菲茬,決定還是陪他去吃一碗。 拉面...
    菊上陽光2閱讀 128評論 0 0