block学习笔记
?
Blocks 是一個(gè)帶有自動(dòng)變量值的匿名函數(shù)
1 block語法
完整形式的block語法與一般c語言函數(shù)定義,有兩點(diǎn)不同
(1)沒有函數(shù)名
(2)帶有 "^"
c:
int func(int a)
{
return a;
}
block:
^int (int a)
{
return a;
}
block語法的BN范式: ^返回類型 參數(shù)列表 表達(dá)式 ^ int (int count){...};
可以省略為?^ 參數(shù)列表 表達(dá)式^ (int count){...};
如果沒有參數(shù)可以省略為?^ 表達(dá)式^ {...};
?
2 block類型變量
c語言中函數(shù)指針表達(dá)方式:
int func(int count)
{...}
int (*funcptr)(int count);
?
block語法將"*" 換為 "^"
int (^blk)(int) = ^ (int count){...};
int (^)(int)為block類型 blk為變量名
?
賦值操作
int (^blk1)(int) = blk 將blk賦值給新變量blk1
?
為了方便記述可以用c中方法typedef來解決該問題
typedef int (^blt_t)(int); 定義了一個(gè)block類型
blt_t myBlock = ^(int count){...};
int (^myBlock)(int)?= ^(int count){...};
?
blt_t myBlock; =>?int (^myBlock)(int) ;
以上2個(gè)表達(dá)式是等價(jià)的.
注意:typedef int (^blt_t)(int); 和?int (^blt_t)(int); 不一樣前者是一個(gè)類型,后者是一個(gè)類型變量要區(qū)分
?
當(dāng)用于函數(shù)參數(shù)的時(shí)候可以以下方式:
1 -(void)setCallBack:(void (^)(int?data)) block
2?typedef int (^blt_t)(int);
? -(void)setCallBack:(blt_t) block
?
3 截獲自動(dòng)變量
前面介紹了匿名函數(shù),這節(jié)介紹什么是帶有自動(dòng)變量值。
在block表達(dá)式中截獲所有的自動(dòng)變量的值,即保存該自動(dòng)變量的瞬間值,即使改寫block中使用的自動(dòng)變量也不會(huì)影響block執(zhí)行時(shí)自動(dòng)變量的值。
? ? int n = 10;
? ? void (^testBlock)() = ^()
? ? {
? ? ? ? NSLog(@"block :%d", n);
? ? };
? ??n = 20;
? ? testBlock(n);
這里block截獲了n得瞬間值10,雖然在調(diào)用block之前修改了n的值,但是打印出來的還是10.
?
__block 說明符
想在block表達(dá)式中修改block以外的自動(dòng)變量,需要在該自動(dòng)變量前面加上__block說明符
? ? __block int?n =?10;
? ??void?(^testBlock)() = ^()
? ? {
? ? ? ??NSLog(@"block :%d", n);
? ? };
? ??n =?20;
? ? testBlock(n); 打印出來20.
?
4 OC對(duì)象瞬間值
int val = 0;
void (^blk)(void) = ^{val = 1;}; 如果在block中修改自動(dòng)變量會(huì)產(chǎn)生編譯錯(cuò)誤。
那如果用oc對(duì)象呢?
id array = [[NSArray alloc]init];
void (^blk)(void) = ^{
id obj =?[[NSObject alloc]init];
[array addObject:obj];
}
這是沒問題的,但是如果你要修改自動(dòng)變量array的值也會(huì)產(chǎn)生編譯錯(cuò)誤。這個(gè)有點(diǎn)像c語言中將一個(gè)const指針當(dāng)參數(shù)傳到函數(shù)中,雖然不能修改指針的值但是可以修改指針指向的值。
?
posted on 2015-05-19 08:38 城之內(nèi) 閱讀(...) 評(píng)論(...) 編輯 收藏轉(zhuǎn)載于:https://www.cnblogs.com/HypeCheng/p/4513563.html
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
- 上一篇: 一键u启动怎么制作u盘 如何制作一键U启
- 下一篇: [HDOJ1016]Prime Ring