回顧一下在工作中使用block遇到一些問題和新的認識.
block本質(zhì)
block的本質(zhì)就是C語言的函數(shù)指針,本身就是代碼塊—-特殊的匿名函數(shù).同時block可以作為參數(shù)在方法和函數(shù)間傳遞數(shù)值.也可以作為方法和函數(shù)的返回值. 經(jīng)常在界面實現(xiàn)數(shù)值傳遞.用于異步和回傳.
block經(jīng)常使用的還是作為參數(shù)傳值,最大的好處是可以在不同情況下回調(diào)不同的代碼.
block的內(nèi)存管理
block在ARC環(huán)境下,使用strong和copy修飾的效果是一樣的
在ARC和MRC環(huán)境下,block如果沒有引用外部變量,保存在”全局區(qū)”
block如果應用外部變量,ARC的環(huán)境下,保存在”堆區(qū)”;MRC的環(huán)境下保存在”棧區(qū)”,必須使用copy來修飾.
在block中修飾外部變量的時候,要在變量前用__block修飾.
__weak在RAC下,用weak只能修飾對象,不能修飾基本數(shù)據(jù)類型.
block對象可以在block中被重新賦值,weak不可以.
block的循環(huán)引用問題
block如果調(diào)用了宿主對象,可能會發(fā)生循環(huán)引用問題. 也就是用 self 持有block,而同時block持有self.
避免循環(huán)引用的方法:
打斷循環(huán)連接才可以,所以用weakunsafe_unretained來修飾block;或者用weakself來代替block.
一般局部block大膽使用self不
會造成循環(huán)引用.
block的特點總結
1.在類中,定義一個block變量,就像定義一個函數(shù): [名][參數(shù)][返回值]
2.block可以定義在方法內(nèi)部,也可以定義在方法外部,其實就是全局變量,如果有同名的局部block,優(yōu)先調(diào)用局部block.
3.只有調(diào)用block的時候,才會執(zhí)行block{}內(nèi)的代碼塊.
4.方便實現(xiàn)兩個頁面之間的傳值
如果想更深入的了解block的話,可以再終端輸入 “clang -rewrite-objc”命令,將項目以C++重寫,這樣就能看到block的底層結構