概述
block:蘋果在iOS4開始引入的對C語言的擴展,用來實現(xiàn)匿名函數(shù)的特性。
匿名函數(shù):沒有函數(shù)名的函數(shù),一對{}包裹的內(nèi)容是匿名函數(shù)的作用域。
block語法
- block變量聲明: 返回值類型(^block變量名)(參數(shù)列表)鼓鲁;
//聲明一個無返回值,有兩個int類型參數(shù)的港谊,叫做blk的block
void(^blk)(int a, int b);
- block表達式語法:^返回值類型(參數(shù)列表){表達式}骇吭;
//無參數(shù)無返回值的block表達式
^void(void){
NSLog(@"這是block塊");
};
- block變量賦值: 返回值類型(^block變量名)(形參類型) =^(形參列表){表達式};
//定義了一個返回值為int型歧寺,有兩個int類型參數(shù)的燥狰,叫做add的block棘脐。表達式內(nèi)將兩個int參數(shù)相加,并將結(jié)果返回
int(^add)(int,int) = ^(int a,int b) {
int c = a+b;
return c;
};
int result = add(5,4);
NSLog(@"result----%d",result);
使用typedef簡寫格式為:typedef 返回值類型(^block變量名)(形參列表)
//用typedef定義一個block
typedef int(^ADD)(int,int);
// ADD就變?yōu)榱艘环NBlock類型龙致,可以像聲明變量一樣來聲明ADD
ADD add_k = ^(int a,int b) {
int c = a+b;
return c;
};
int result_k = add_k(4,2);
NSLog(@"result_k----%d",result_k);
block與外界變量
截獲自動變量值
對于 block 外的變量引用蛀缝,block 默認(rèn)是將其復(fù)制到其數(shù)據(jù)結(jié)構(gòu)中來實現(xiàn)訪問的。也就是說block的自動變量截獲只針對block內(nèi)部使用的自動變量, 不使用則不截獲, 因為截獲的自動變量會存儲于block的結(jié)構(gòu)體內(nèi)部, 會導(dǎo)致block體積變大目代。特別要注意的是默認(rèn)情況下block只能訪問不能修改局部變量的值屈梁。
int a = 10;
void(^blk)(void) = ^(void) {
NSLog(@"block內(nèi)部a----%d",a);
};
a = 15;//Block外修改a,不影響block內(nèi)的自動變量
blk();//block內(nèi)部a----10
NSLog(@"a----%d", a);//a----15
__block 修飾的外部變量
對于用__block
修飾的外部變量引用像啼,block 是復(fù)制其引用地址來實現(xiàn)訪問的俘闯。block可以修改__block
修飾的外部變量的值。
__block int a = 10;a為__block變量忽冻,可在block中重新賦值
void(^blk)(void) = ^(void) {
NSLog(@"block內(nèi)部a----%d",a);
};
a = 15;
blk();//block內(nèi)部a----15
NSLog(@"a----%d", a);//a----15
防止block循環(huán)引用
對block內(nèi)要使用的對象A使用__weak
進行修飾真朗,block對對象A弱引用打破循環(huán)。
__weak typeof(self) weakSelf = self;
self.blk = ^{
NSLog(@"In Block : %@",weakSelf);
};
參考:完整項目資料下載