OC 日常筆記碎片知識
Block基本概念
Block是iOS中一種比較特殊的數(shù)據(jù)類型.
- 蘋果推薦使用的數(shù)據(jù)類型,應(yīng)用場景廣泛.
- 例如:動畫,多線程,集合遍歷,網(wǎng)絡(luò)請求回調(diào).
- Block的作用是用來保存某一段代碼,可以在恰當(dāng)時機(jī)取出來調(diào)用,功能類似于函數(shù)和方法.
Block的格式
- 如何定義?
返回值類型 (^blcok變量名)(形參列表) = ^(形參列表) {};
*回顧C(jī)函數(shù)指針.
封裝方法.
函數(shù)指針的使用
3個參數(shù)理解
無參數(shù)無返回值的Block
C函數(shù)如何遍歷輸出?
函數(shù)指針如何保存?
有參數(shù)沒有返回值Block
C函數(shù)是怎么定義有參數(shù),有返回值的?
有返回值有參數(shù)Block
無返回值,有參數(shù)Block.
*注意點(diǎn): 如果Block沒有參數(shù),那么^后面的( )可以省略.
Block與Typedef
- 定義簡單加減法函數(shù)
查看輸出結(jié)果
發(fā)現(xiàn)有相似之處,如何處理? Typedef利用別名定義變量
Typedef在Blcok中的使用
*總結(jié): Typedef很好減少了代碼重復(fù),利用別名定義變量,更好代碼閱讀性.
Block的應(yīng)用場景
當(dāng)發(fā)現(xiàn)重復(fù)代碼時,可考慮把代碼封裝進(jìn)一個方法里,把不一樣的代碼利用Block傳入即可.
*對于Block的使用場景還處于初步階段,暫時還體驗(yàn)不到好處,但通過觀察發(fā)現(xiàn)由外界傳入?yún)?shù)決定事件,完全符合封裝目的.
Block注意點(diǎn)與本質(zhì)
block可以訪問外界變量嗎?
如果在block里定義同名變量,block會選擇哪個?
block塊中能修改外面的變量嗎?
原因是什么?
在外界修改block使用的變量,會有影響嗎?
如何修改里面的值?對外界的變量會有影響嗎?
當(dāng)添加__blcok,那么打印內(nèi)存地址會一樣嗎?
*思考加了__block導(dǎo)致打印內(nèi)存地址不一樣呢?
- 首先生成把mian.m文件生成C語言
- 找到目標(biāo)
- 查看
- 重新生成一份
Block在MRC中的內(nèi)存管理
- 首先生成person類
- 如何在MRC中防止內(nèi)存泄漏?
- 經(jīng)典面試題: block是存儲在堆中還是棧中
- 默認(rèn)情況下block存儲在棧中,如果對block進(jìn)行一個copy操作,block會轉(zhuǎn)移到堆中.
-2.如果block在棧中, block中訪問了外界的對象,那么不會對對象進(jìn)行retain操作
-3.但是如果block在堆中,block中訪問了外界的對象,那么會對外界的對象進(jìn)行一次retain
- 默認(rèn)情況下block存儲在棧中,如果對block進(jìn)行一個copy操作,block會轉(zhuǎn)移到堆中.
**總結(jié): 如果在block中訪問了外界的對象,一定要給對象加上__block,只要加上了,哪怕block在堆中,也不會對外界的對象進(jìn)行retain.