山西省建设厅执业资格注册中心网站,财税公司怎么找客源,做一个天猫店铺要多少钱,深圳工程建设Block简介
Blocks是C语言的扩充功能。可以用一句话来表示Blocks的扩充功能#xff1a;带有自动变量的匿名函数。
匿名函数
所谓匿名函数就是不带有名称的函数。C语言的标准不允许存在这样的函数。例#xff1a;
int func(int count);它声明了名称为func的函数。下面的源代…Block简介
Blocks是C语言的扩充功能。可以用一句话来表示Blocks的扩充功能带有自动变量的匿名函数。
匿名函数
所谓匿名函数就是不带有名称的函数。C语言的标准不允许存在这样的函数。例
int func(int count);它声明了名称为func的函数。下面的源代码中为了调用该函数必须使用该函数的名称func。
int result func(10);但其实使用函数指针也仍需要知道函数名称。像以下源代码这样在赋值函数指针时若不使用想复制的函数的名称就无法取得该函数的地址。
int (*funcptr)(int) func;
int result (*funcptr)(10);而通过Blocks源代码中就能够使用匿名函数。
自动变量
首先回顾一下在C语言的函数中可能使用的变量。
自动变量局部变量函数的参数静态变量静态局部变量静态全局变量全局变量
其中在函数的多次调用之间能够传递的变量有
静态变量静态局部变量静态全局变量全局变量
虽然这些变量的作用域不同但在整个程序当中一个变量总保持在一个内存区域。因此虽然多次调用函数但改变量值总能保持不变在任何时候以任何状态调用使用的都是同样的变量值。
int buttonId 0;
void buttonCallblack(int event) {printf(buttonId:%d event%d\n, buttonId, event);
}如果只有一个按钮那么该代码毫无问题可正常运行。但有多个按钮时会如何呢
int buttonId;void buttonCallBack(int event) {printf(buttonId:%d event%d\n, buttonId, event);
}void setButtonCallbacks() {for (int i 0, i BUTTON_MAX; i) {buttonId i;setButtonCallback(BUTTON_IDOFFSET i, buttonCallback);}
}该源代码到的问题很明显。全局变量buttonId只有一个所有回调都使用for循环最后的值。
如果不使用全局变量回调方会将按钮的ID作为函数参数传递就能解决该问题。
void buttonCallback(int buttonId, int event) {printf(buttonId:%d event%d\n, buttonId, event);
}但是回调方在保持回调函数的指针以外还必须保持回调方的按钮ID。
C和Objective-C使用类可保持变量值且能够多次持有该变量自身。它会声明持有成员变量的类由类生成的实例或对象保持该成员变量的值。
我们可以来思考一下刚才例子中用来回调按钮的类。
interface ButtonCallbackobject : NSObject
{int buttonId_;
}
endimplementation ButtonCallbackObject
- (id) initWithButtonId:(int)buttonId
{self [super init];buttonId_ buttonId;return self;
}- (void) callback:(int)event
{NSLog(buttonId:%d event%d\n, buttonId_, event);
}
end如果使用该类由于对象保持按钮ID因此回调方只需要保持对象即可。可如下使用
void setButtonCallbacks() {for (int I 0; I BUTTONMAX; I) {ButtonCallbackObject *callbackObj [[ButtonCallbackObject alloc] initWithButtonId:I];setButtonCallbackUsingObject(BUTTON_IDOFFSET, callbackObj);}
}缺点增加代码长度。
Blocks
这时我们就要用到Blocks了。Blocks提供了类似由C和Objective-C类生成实例或对象来保持变量值的方法其代码量与编译C语言函数差不多。如“带有自动变量值”Blocks保持自动变量的值。下面我们使用Blocks实现上面的按钮回调
void setButtonCallbacks()
{for (int I 0; I BUTTON_MAX; I) {setButtonCallbackUsingBlock(BUTTON_IDOFFSET I, ^(int event) {printf(buttonID:%d event%d\n, I, event);});}
}该源代码将“带有自动变量i值的匿名函数”设定为按钮的回调。Blocks中将该匿名函数部分称为“Block literal”或简称为“Block”。
像这样使用Blocks可以不声明C和Objective-C类也没有使用静态变量、静态全局变量或全局变量时的问题。
Block在其他程序语言中的名称