Block(塊)

定義

帶有局部變量(自動變量)的匿名函數(shù)

ps :
“帶有局部變量”:可以獲取到塊外面的變量(將變量放在自身(block)的結(jié)構(gòu)體中豌拙;獲取的只是改變量的瞬時值抓谴,后面對變量的修改不會使塊中的變量也被修改)讹语,但是只能讀攘骺弧嘶摊;
要改寫的話需給變量前面加"__block"修飾符 _(將該變量變成和Block一樣的結(jié)構(gòu)體實例,并在自身的結(jié)構(gòu)體添加一個對結(jié)構(gòu)體中值的指針引用伏社;分開兩個結(jié)構(gòu)體(block的結(jié)構(gòu)體 , 變量的結(jié)構(gòu)體)是為了能夠在多個Block中用到_block變量)

本質(zhì)

C語言中的結(jié)構(gòu)體和函數(shù)抠刺,OC語言中對象

語法

^ 返回值類型 參數(shù)列表 表達式(斜體代表可省略)

ps:
省略返回值類型時,如果表達式中有return就使用該返回值的類型摘昌,如果沒有return就使用void類型;表達式中含多個return語句時速妖,所有return的返回值類型必須一致

分類

所屬類 說明
棧塊 _NSConcreteStackBlock 編譯器會給每個塊分配好棧內(nèi)存, 然而等離開了相應(yīng)的范圍之后聪黎,編譯器有可能把分配給塊的內(nèi)存覆寫掉罕容。
堆塊 _NSConcreteMallocBlock 帶引用計數(shù)的塊對象;棧塊通過copy方法可成為堆塊
全局塊 _NSConcreteGlobalBlock (存儲域為程序的數(shù)據(jù)區(qū)域 .data區(qū)) 塊不會捕捉任何狀態(tài)(比如外圍的變量等),運行時也無須有狀態(tài)來參與杀赢。塊所使用的整個內(nèi)存區(qū)域烘跺,在編譯期已經(jīng)完全確定了。

ps:全局塊:對其的拷貝操作是個空操作脂崔,因為全局塊決不可能為系統(tǒng)所目收滤淳。這種塊實際上相當(dāng)于單例。下面就是個全局塊:

void (^ablock)() = ^{
    NSLog(@"This is a block");

}

由于運行該塊所需的全部信息都能在編譯期確定砌左,所以可把它做成全局塊脖咐。這完全是種優(yōu)化技術(shù):若把如此簡單的塊當(dāng)成復(fù)雜的塊來處理,那就會在復(fù)制及丟棄該塊時執(zhí)行

9460be12gw1eyxyexv5omj20zi0t6tdm.jpg

)

從棧到堆

對于Block (用copy方法)

使用場景:向方法或函數(shù)的參數(shù)中傳遞Block時
不需手動復(fù)制的情況:

  • Cocoa框架的方法且方法名中含有usingBlock時
    
  • GCD的API
    
  • 將block作為函數(shù)返回值返回時汇歹,將Block賦值給用__strong修飾的id類或Block類型成員變量時屁擅,編譯器會自動將對象的Block作為參數(shù)并調(diào)用_Block_copy函數(shù)(和copy效果一樣)
    
源存儲域 復(fù)制效果
棧 -> 堆
引用計數(shù)增加
程序的數(shù)據(jù)區(qū)域 什么也不做

對于__block變量

跟隨Block移動:當(dāng)一個引用__block變量的Block從棧到堆時,__block變量也從棧到堆产弹,并持有該變量派歌;當(dāng)有另外一個也引用了該__block變量的Block從棧到堆時,該Block也持有該變量并且該變量引用計數(shù)加一痰哨,

參考資料:
《Objective-C高級編程》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末胶果,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子斤斧,更是在濱河造成了極大的恐慌早抠,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件撬讽,死亡現(xiàn)場離奇詭異蕊连,居然都是意外死亡,警方通過查閱死者的電腦和手機游昼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進店門甘苍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人酱床,你說我怎么就攤上這事羊赵√说瑁” “怎么了扇谣?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長闲昭。 經(jīng)常有香客問我罐寨,道長,這世上最難降的妖魔是什么序矩? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任鸯绿,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘瓶蝴。我一直安慰自己毒返,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布舷手。 她就那樣靜靜地躺著拧簸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪男窟。 梳的紋絲不亂的頭發(fā)上盆赤,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天,我揣著相機與錄音歉眷,去河邊找鬼牺六。 笑死,一個胖子當(dāng)著我的面吹牛汗捡,可吹牛的內(nèi)容都是我干的淑际。 我是一名探鬼主播,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼扇住,長吁一口氣:“原來是場噩夢啊……” “哼庸追!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起台囱,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤淡溯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后簿训,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體咱娶,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年强品,在試婚紗的時候發(fā)現(xiàn)自己被綠了膘侮。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡的榛,死狀恐怖琼了,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情夫晌,我是刑警寧澤雕薪,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站晓淀,受9級特大地震影響所袁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜凶掰,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一燥爷、第九天 我趴在偏房一處隱蔽的房頂上張望蜈亩。 院中可真熱鬧,春花似錦前翎、人聲如沸稚配。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽药有。三九已至,卻和暖如春苹丸,著一層夾襖步出監(jiān)牢的瞬間愤惰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工赘理, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留宦言,地道東北人。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓商模,卻偏偏與公主長得像奠旺,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子施流,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,860評論 2 361

推薦閱讀更多精彩內(nèi)容