簡(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)型

打印結(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

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