国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

iOS開發-語法篇-block詳解

2019-11-14 19:38:00
字體:
來源:轉載
供稿:網友

一:基本定義

 

/*初步上式block定義的一些理解和解釋,接下來會詳解:

 *block名為myBlock,結合C的函數指針,myBlock為block體的指針,指向block體的入口地址

 *int result = myBlock(5) <==> ^(int num){return num*num}(5)//將5傳給num

 *回調時可以將myBlock作為參數傳入,也可以直接傳入block體^(int num){&hellip;};//

 *整個block體作為參數傳入時,往往沒有參數,只是進行延遲運算作用,因為定義了block內容

  如果是暫時左值不需要的話,block是不執行的。

  例:[request setFailedBlock:^{NSError *error = [request error]; };];

  //如果不執行setFailedBlock方法時,后面的block是不執行的,只是靜靜地待在堆中,原理接下來會說到。

 */

二:block原理

 首先介紹基本的block,將OC語言block改寫成C語言的block

具體步驟:

我們通過IMP定義可以看出:

在main()函數中,block的返回值為(void(*)()),其實就是一個函數指針,所在在這種情況下,block就可以看做是匿名函數的函數指針來對待。

三:關鍵字__block

主要作用:1.block對外部變量是只讀的,要變成可讀可寫,就需要加上__block

     2.將棧中的block復制到堆上一份,從而避免了循環引用這個情況

將帶有__block關鍵字的block進行OC->C語言轉換:

四:存儲類型

  block的存儲形態有三種:_NSConcretStackBlock(棧)、_NSConcretGlobalBlock(全局)、_NSConcretMallocBlock(堆)

  要點一:當block在函數內部,且定義的時候就使用了函數內部的變量,那么這個  block是存儲在棧上的。

  要點二:當block定義在函數體外面,或者定義在函數體內部且當時函數執行的時候,block體中并沒有需要使用函數內部的局部變量時,也就是block在函數執行的時候只是靜靜地待在一邊定義了一下而不使用函數體的內容,那么block將會被編譯器存儲為全局block。

  要點三:全局block存儲在堆中,對全局block使用copy操作會返回原函數指針;而對棧中的block使用copy操作,會產生兩個不同的block地址,也就是兩個匿名函數的入口地址。

  要點四:ARC機制優化會將stack的block,轉為heap的block進行調用。

以下存儲類題目摘自cocoaChina論壇:

 

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 贡觉县| 梨树县| 琼结县| 克山县| 山丹县| 鲁山县| 十堰市| 棋牌| 保靖县| 台湾省| 林芝县| 彝良县| 浦县| 柳江县| 新民市| 武夷山市| 鄱阳县| 运城市| 岑溪市| 前郭尔| 民勤县| 内黄县| 罗定市| 桂林市| 景洪市| 武义县| 利川市| 互助| 佛坪县| 芒康县| 黔江区| 枝江市| 永康市| 呈贡县| 西峡县| 梓潼县| 宣武区| 胶南市| 磐安县| 湖南省| 田林县|