Block底層原理

循環(huán)引用

對象持有Block, Block 又捕獲該對象

__weak不會產(chǎn)生強引用,指向的對象銷毀時,會自動將指針置為nil。因此一般通過__weak來解決問題。

__unsafe_unretained不會產(chǎn)生強引用,不安全,指向的對象銷毀時,指針存儲的地址值不變。

使用__block也可以解決循環(huán)引用的問題, 只是在block執(zhí)行之后才會把__block的結構體置為nil,解除循環(huán)引用

捕獲對象

Block 會捕獲局部變量,不會捕獲全局變量,因為全局變量在哪里都可以訪問,不需要捕獲。

注意:為什么會捕獲self
因為無論是對象方法或類方法,都會默認將self作為參數(shù)傳遞到方法內(nèi)部,作為參數(shù)的話就是局部變量,局部變量就會被Block捕獲。
訪問方式:

  1. auto變量: 值傳遞 (值捕獲)
  2. 局部static變量:指針傳遞 (地址捕獲)
  3. 全局變量:直接訪問 (不捕獲)
內(nèi)存區(qū)域變化

新創(chuàng)建的Block默認在數(shù)據(jù)段中,引用局部變量時會捕獲變量,且Block會變?yōu)闂^(qū);
棧區(qū)Block被copy或賦值給Strong變量后會變?yōu)槎褏^(qū)Block;
堆區(qū)Block被copy后類型不發(fā)生改變,引用計數(shù)增加

ARC環(huán)境下,編譯器會根據(jù)情況自動將棧區(qū)的Block進行一次copy操作,將Block復制到堆上, 以下情況會進行copy操作:
  1. Block作為函數(shù)返回值時
  2. 將Block賦值給 __strong指針時
  3. Block作為Cocoa API中方法含有usingBlock的方法參數(shù)時
  4. Block作為GCD API的方法參數(shù)時
對象類型的引用
  1. Block捕獲的變量為對象類型,會生成copy和dispose方法對內(nèi)部引用的對象進行內(nèi)存管理
  2. Block在棧上,訪問對象類型auto變量時,不會對改變量產(chǎn)生強引用,不論Block結構體內(nèi)部的變量時__strong修飾還是__weak修飾
  3. 如果Block被拷貝到堆上,copy函數(shù)會調(diào)用assign函數(shù),根據(jù)auto變量的修飾符去形成強引用或弱引用
  4. 如果Block從堆中移除,會調(diào)用dispose函數(shù)自動釋放引用的auto變量
Block內(nèi)部不能修改局部變量的原因
  1. Block內(nèi)部是值引用,拿到的只是Block內(nèi)部的值,因此無法修改外部的變量
  2. 使用static修飾基本數(shù)據(jù)類型變量可以拿到變量地址,因此可以在Block內(nèi)部修改外部變量值
  3. __block修飾可以解決Block內(nèi)部不能修改變量值的問題,不可以用來修飾static變量和全局變量。__block將變量包裝成對象,把變量封裝在結構體中,Block內(nèi)部存儲的是結構體指針,可以通過指針找到內(nèi)存地址進而修改變量的值
  4. 僅僅使用內(nèi)存地址,而不是修改該變量的話,不用添加__block,否則系統(tǒng)會自動創(chuàng)建相應的結構體進行存儲,占用不必要的內(nèi)存
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

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

  • 本文主要介紹:1、block的本質(zhì)2、block捕獲變量3、block的類型4、__block原理 本質(zhì) 通過cl...
    AcmenL閱讀 373評論 0 2
  • 一、block對對象變量的捕獲 block一般使用過程中都是對對象變量的捕獲,那么對象變量的捕獲同基本數(shù)據(jù)類型變量...
    iOS_進擊的小學生閱讀 278評論 0 1
  • 在OC中, 函數(shù)式編程是借由block實現(xiàn)的, 通過聲明一個block, 類似于定義了一個“函數(shù)”, 再將這個bl...
    Sweet丶閱讀 1,055評論 0 1
  • 探尋block的本質(zhì) 一.首先對block有一個基本的認識 block本質(zhì)上也是一個oc對象,他內(nèi)部也有一個isa...
    iOS_進擊的小學生閱讀 558評論 0 0
  • block的原理是怎樣的?本質(zhì)是什么?答: block本質(zhì)是封裝了函數(shù)調(diào)用和調(diào)用環(huán)境的OC對象,本質(zhì)是結構體,bl...
    zbzbwxe閱讀 947評論 0 1

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