block的一些很基礎(chǔ)的玩意

簡(jiǎn)介

雖然工作了很長(zhǎng)時(shí)間了,之前也是從一個(gè)不相關(guān)的職業(yè)改行到iOS的開(kāi)發(fā);;一個(gè)人開(kāi)發(fā)的過(guò)程很沒(méi)意思(沒(méi)人和你交流提升自然很慢)....寫(xiě)過(guò)的程序用起來(lái)還不錯(cuò),滿(mǎn)足了用戶(hù)的需求,但是當(dāng)被問(wèn)及一些類(lèi)似基礎(chǔ)面試題,一些原理以及一些第三方的基本實(shí)現(xiàn)原理的時(shí)候,還是萌萌噠(主要是蒙圈了)

所以我決定"從新","從低"的學(xué)習(xí)iOS...

本文主要參考Cooper's Blog的文章,自己模仿寫(xiě)的,估計(jì)有很多的不足之處,希望大家可以指教, 想看深一層的請(qǐng)點(diǎn)擊大神連接查看,這篇文章里說(shuō)的都是我個(gè)人理解(偏于大白話),寫(xiě)這個(gè)主要是想讓自己加深印象

這文章中提及的都是在ARC環(huán)境下測(cè)試的

1.Block在內(nèi)存中的位置

  • 第一種類(lèi)型
    屏幕快照 2015-08-31 下午7.21.14.png

    上面的代碼打印出來(lái)的值是 <NSGlobalBlock: 0x100871090>
    由打印結(jié)果可以看出來(lái)類(lèi)型是:NSGlobalBlock,全局block,存儲(chǔ)在代碼區(qū)
  • 第二種類(lèi)型

屏幕快照 2015-08-31 下午7.42.01.png

打印結(jié)果: <NSMallocBlock: 0x7f8e72f0f410>
由打印結(jié)果可以看出來(lái)類(lèi)型是: _NSMallocBlock ,堆block 存儲(chǔ)在堆區(qū)

總結(jié)以上2中block的區(qū)別: 簡(jiǎn)單的說(shuō)就是看block中是否用到了block之外的變量,第一種的是沒(méi)有用到外部的變量,第二種的時(shí)候用到了block外部的局部變量,我們?cè)谕獠看蛴〉闹赶騮emp指針的地址和在block內(nèi)部打印的結(jié)果不一樣,這也許就是說(shuō)的需要將局部變量copy一下,這就是區(qū)別所在.

  • 第三種類(lèi)型
    我測(cè)試的環(huán)境是ARC,當(dāng)你把block定義成一個(gè)屬性用weak/assign來(lái)修飾的時(shí)候
    1.如果你使用了block之外的局部變量,則此時(shí)的block是<NSStackBlock: 0x7fff5a9e9a50>
    2.如果沒(méi)用使用外部的局部變量,則此時(shí)的是***<NSGlobalBlock: 0x1095c6080>****

2.block循壞引用

  • 在MRC下,為了避免循環(huán)引用的問(wèn)題我們需要用__block
  • 在ARC下,由于__block取變量的時(shí)候一樣會(huì)被block retain,所以在ARC情況下應(yīng)該使用__weak(弱引用)
  • 當(dāng)block聲明為屬性的時(shí)候,應(yīng)該使用copy來(lái)修飾,因?yàn)檫@樣block才能將block拷貝到堆上,要不就跑棧上了,棧區(qū)就不是你控制的了啊

3.__weak的使用

參考文章__weak和__block的區(qū)別
在Block中使用成員變量,retain的不是這個(gè)變量,而會(huì)retain self
在ARC下為了防止循環(huán)引用用__weak

屏幕快照 2015-09-01 下午5.02.52.png

如果我們正在執(zhí)行block中,這時(shí)如果是外部把model = nil 那么block中的weakModel的值也會(huì)被設(shè)置成nil,這也許就違背了使用的意圖
解決方法是:如上圖所示 __strong接受一些weakmodel,這樣就可以避免

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 《Objective-C高級(jí)編程》這本書(shū)就講了三個(gè)東西:自動(dòng)引用計(jì)數(shù)、block、GCD,偏向于從原理上對(duì)這些內(nèi)容...
    WeiHing閱讀 10,101評(píng)論 10 69
  • Block簡(jiǎn)介(copy一段) Block作為C語(yǔ)言的擴(kuò)展,并不是高新技術(shù),和其他語(yǔ)言的閉包或lambda表達(dá)式是...
    qui丶MyLove閱讀 494評(píng)論 0 0
  • 前言 Blocks是C語(yǔ)言的擴(kuò)充功能,而Apple 在OS X Snow Leopard 和 iOS 4中引入了這...
    小人不才閱讀 3,869評(píng)論 0 23
  • 一、Objective-C發(fā)展史 Objective-C從1983年誕生,已經(jīng)走過(guò)了30多年的歷程。隨著時(shí)間的推移...
    沒(méi)事蹦蹦閱讀 6,001評(píng)論 12 34
  • *面試心聲:其實(shí)這些題本人都沒(méi)怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來(lái)就是把...
    Dove_iOS閱讀 27,623評(píng)論 30 472

友情鏈接更多精彩內(nèi)容