Block的知識點

Block對象是一個C底層的語法和運行時特性,它和標準的C函數有點相似,但除了可執行的代碼它們包含變量自動綁定?;蛟诙褍裙芾韮却?。因此塊可以維護一系列的狀態-當執行時用于影響它的行為。
你可以使用塊去結合被傳給API的函數表達式,額外儲存 和被多線程使用。Block作為回調是十分有用的,因為Block都攜帶被執行的代碼在回調時,并且在執行期間數據是必須的。
Block在GCD和Clang是可用的,block運行時是開源的,在相關網站可以找到關于這個的有關內容。
1,聲明和使用blocks
你可以用……操作符去聲明block變量今兒提示block字面值的開頭。block自身的body在{}內,例如
int multiplier = 12;
int (^myBlock)(int) = ^(int num) {
return num * multiplier;
};
Note:int 指的是block的返回值類型,^表示這是一個block,而myBlock則表示聲明了一個變量*myBlock,而num則指的是帶一個參數,而{}內則是block的body。這是一個完整的block聲明與使用的例子。
2,直接使用blocks
在許多時間中,不必聲明block變量,相反你在要求作為參數的地方寫一個塊內聯。
char *myCharacters[3] = { "TomJohn", "George", "Charles Condomine" };

qsort_b(myCharacters, 3, sizeof(char *), ^(const void *l, const void *r) {
char *left = *(char **)l;
char *right = *(char **)r;
return strncmp(left, right, 1);
});

// myCharacters is now { "Charles Condomine", "George", "TomJohn" }
3,塊與cocoa
在cocoa 框架中,一系列的方法帶塊作為一個參數,典型的要么去在對象的集合上去實現操作 要么在一個操作完成后作為一個回調使用,下面的例子展示如何使用帶有sortedArrayUsingComparator:的塊
NSArray *stringsArray = @[@"string1",@"string3",@"string4",@"string5"];
static NSStringCompareOptions comparisonOptions = NSCaseInsensitiveSearch | NSNumericSearch | NSWidthInsensitiveSearch | NSForcedOrderingSearch;
NSLocale *currentLocale = [NSLocale currentLocale];
NSComparator finderSortBlock = ^(id string1,id string2) {
NSRange string1Range = NSMakeRange(0, [string1 length]);
return [string1 compare:string2 options:
comparisonOptions range:string1Range locale:currentLocale];
};
NSArray *finderSortArray = [stringsArray sortedArrayUsingComparator:finderSortBlock];
NSLog(@"finderSortArray:%@",finderSortArray);
結果如下所示:
finderSortArray:(
string1,
string3,
string4,
string5
)
塊概念上的綜述
塊對象給我們提供了一個方式去在C語言和C衍生的語言中生成一個特殊的函數體作為表達式,例如OC,C++。在其他語言和環境中,一個塊對象有時候被稱之為閉包
Block的功能
只有了解了功能,你才能找到對應的場景去使用它。
一個塊是代碼的一個匿名內聯集合-有一個類型參數列表正如一個函數,有一個推斷或聲明的返回值類型,能在它定義的詞法作用域內捕捉狀態,能額外的修改詞法作用域內的狀態,能在相同的詞法作用域內,可以分享潛在的修改與其他模塊中定義相同的詞法作用域可以繼續分享和詞法作用域內定義的修改狀態后(堆棧幀)詞法作用域(堆棧幀)已經被摧毀了你可以復制一個街區,甚至將其傳遞給其他線程對延遲執行(或者,在它自己的線程,runloop)。編譯器和運行時安排所有變量引用塊保存的所有副本的生活。盡管塊可用純C和c++,一塊也總是一個objective - C對象。

block的使用
塊代表通常很小,具有獨立的代碼塊。這樣,他們特別有用的封裝的工作單元可能并發執行,或在項目集合,或者作為回調當另一個操作完成。塊是一個有用的替代傳統的回調函數,主要有兩個原因:他們允許你編寫代碼的調用方法的上下文中執行后實現。塊因此經??蚣芊椒ǖ膮怠K麄冊试S訪問本地變量。而不是使用回調函數需要一個數據結構,包含了所有你需要的上下文信息來執行一個操作,只需直接訪問本地變量。
聲明使用
您還可以創建類型blocks-這樣做所以通常被認為是最佳實踐,當你使用一塊與給定的簽名在多個地方:例如
typedef float (^MyBlockType)(float, float);

MyBlockType myFirstBlock = // ... ;
MyBlockType mySecondBlock = // ... ;

Block和變量

塊對象的身體內的代碼,變量可能被視為五個不同的方法。你可以參考三種標準類型的變量,就像從一個函數:全局變量,包括靜態局部變量全局函數(這不是技術變量)從一個封閉范圍局部變量和參數塊也支持兩個其他類型的變量:在功能層面上是__block變量。這些是可變塊內(和封閉范圍)和保存如果任何引用塊復制到堆。const進口。最后,在一個方法的實現,模塊可能variables-see objective - c實例對象的引用和塊變量。以下規則適用于變量中使用一塊:訪問全局變量,包括封閉詞法作用域內存在的靜態變量。參數傳遞給塊訪問(就像參數函數)。本地堆棧(非靜態)變量封閉詞法作用域為常量變量捕獲。它們的值是在計劃內的塊表達式。在嵌套塊,價值捕獲從最近的封閉范圍。局部變量的封閉詞法作用域聲明__block存儲修改器提供參考,因此是可變的。反映在封閉詞法作用域的任何更改,包括任何其他模塊中定義相同的封閉詞法范圍。更詳細地討論這些__block存儲類型。局部變量聲明的詞法作用域內,局部變量在函數的完全一樣。每個調用塊提供了一個新的變量的副本。這些變量可以作為常量或按引用調用變量在街區內封閉塊中。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,983評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,772評論 3 422
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,947評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,201評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,960評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,350評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,406評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,549評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,104評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,914評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,089評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,647評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,340評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,753評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,007評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,834評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,106評論 2 375

推薦閱讀更多精彩內容