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