一、什么是Blocks Block是一个C级别的语法以及运行时的一个特性,和标准C中的函数(函数指针)类似,但是其运行需要编译器和运行时支持,从ios4.0开始就很好的支持Block。二、在ios开发中,什么情况下使用Block Block除了能够定义参数列表、返回类型外,还能够获取被定义时的词法范围内的状态(比如局部变量),并且在一定条件下(比如使用__block变量)能够修改这些状态。此外,这些可修改的状态在相同词法范围内的多个block之间是共享的,即便出了该词法范围(比如栈展开,出了作用域),仍可以继续共享或者修改这些状态。通常来说,block都是一些简短代码片段的封装,适用作工作单元,通常用来做并发任务、遍历、以及回调。三、block如何申明(对比于c语言中的函数申明)
四、c函数指正和blocks调用
int (*CFunc) (int a) 函数调用
int result = CFunc(10);
int (^BFunc) (int a) 函数调用
int result = BFunc(10);
五、__block 关键字
一个Block的内部时可以引用自身作用域外的变量的,包括static变量,extern变量或自由变量(定义一个变量的时候,如果不加存储修饰符,默认情况下就是自由变量auto,auto变量保存在stack中的。除了auto之外还存在register,static等存储修饰符),对于自由变量,在Block中只读的。在引入block的同时,还引入了一种特殊的__block关键字变量存储修饰符。
六、block的几个小例子
-
#import<Cocoa/Cocoa.h>
-
-
-
intmain(intargc,char*argv[])
-
{
-
@autoreleasepool{
-
NSLog(@"Helloworld");
-
void(^myblocks)(void)=NULL;
-
myblocks=^(void){
-
NSLog(@"inblocks");
-
};
-
NSLog(@"beforemyblocks");
-
myblocks();
-
NSLog(@"aftermyblocks");
-
-
-
int(^myblocks2)(inta,intb)=^(inta,intb){
-
intc=a+b;
-
returnc;
-
};
-
NSLog(@"beforeblocks2");
-
intret=myblocks2(10,20);
-
NSLog(@"afterblocks2ret%d",ret);
-
-
-
__blockintsum=0;
-
int(^myblocks3)(inta,intb)=^(inta,intb){
-
sum=a+b;
-
return3;
-
};
-
myblocks3(20,30);
-
NSLog(@"sumis%d",sum);
-
}
-
returnNSApplicationMain(argc,(constchar**)argv);
-
}
打印结果如下2012-09-03 10:23:20.878 blockTest[407:403] Hello world2012-09-03 10:23:20.880 blockTest[407:403] before myblocks2012-09-03 10:23:20.881 blockTest[407:403] in blocks2012-09-03 10:23:20.881 blockTest[407:403] after myblocks2012-09-03 10:23:20.882 blockTest[407:403] before blocks22012-09-03 10:23:20.882 blockTest[407:403] after blocks2 ret 302012-09-03 10:23:20.882 blockTest[407:403] sum is 50七、block写的回调例子1、Dog.h
-
#import<Foundation/Foundation.h>
-
-
-
@interfaceDog:NSObject{
-
int_ID;
-
NSTimer*timer;
-
intbarkCount;
-
-
-
void(^BarkCallback)(Dog*thisDog,intcount);
-
}
-
@property(assign)intID;
-
-
-
-
-(void)setBark:(void(^)(Dog*thisDog,intcount))eachBark;
-
-
-
@end
2、Dog.m
-
#import"Dog.h"
-
-
-
@implementationDog
-
@synthesizeID=_ID;
-
-
-
-(id)init
-
{
-
self=[superinit];
-
if(self){
-
-
timer=[NSTimerscheduledTimerWithTimeInterval:1.0ftarget:selfselector:@selector(updateTimer:)userInfo:nilrepeats:YES];
-
-
}
-
returnself;
-
}
-
-
-
-(void)updateTimer:(id)arg
-
{
-
barkCount++;
-
NSLog(@"dog%dbarkcount%d",_ID,barkCount);
-
-
if(BarkCallback){
-
-
BarkCallback(self,barkCount);
-
}
-
}
-
-
-
-
-
-(void)setBark:(void(^)(Dog*,int))eachBark
-
{
-
[BarkCallbackrelease];
-
BarkCallback=[eachBarkcopy];
-
}
-
-
-
-(void)dealloc
-
{
-
[BarkCallbackrelease];
-
[superdealloc];
-
}
-
@end
3、Person.h
-
#import<Foundation/Foundation.h>
-
#import"Dog.h"
-
-
-
@interfacePerson:NSObject
-
{
-
Dog*_dog;
-
}
-
-
-
@property(retain)Dog*dog;
-
-
-
@end
4、Person.m
-
#import"Person.h"
-
-
-
@implementationPerson
-
@synthesizedog=_dog;
-
-
-
-(void)setDog:(Dog*)dog
-
{
-
if(_dog!=dog){
-
[_dogrelease];
-
_dog=[dogretain];
-
-
[_dogsetBark:^(Dog*thisDog,intcount){
-
NSLog(@"persondog%dcount%d",[thisDogID],count);
-
}];
-
}
-
}
-
-
-
-(Dog*)dog
-
{
-
return_dog;
-
}
-
-
-
-(void)dealloc
-
{
-
self.dog=nil;
-
[superdealloc];
-
}
-
-
-
@end
5、Main.m
-
#import<Foundation/Foundation.h>
-
#import"Person.h"
-
#import"Dog.h"
-
-
-
intmain(intargc,constchar*argv[])
-
{
-
-
-
@autoreleasepool{
-
-
-
NSLog(@"Hello,World!");
-
Person*person=[[Personalloc]init];
-
Dog*dog=[[Dogalloc]init];
-
[dogsetID:10];
-
[personsetDog:dog];
-
[dogrelease];
-
while(1){
-
[[NSRunLoopcurrentRunLoop]run];
-
}
-
[personrelease];
-
-
}
-
return0;
-
}
6、打印结果2012-09-03 11:21:08.551 blockDelegate[549:403] Hello, World!2012-09-03 11:21:09.554 blockDelegate[549:403] dog 10 bark count 12012-09-03 11:21:09.555 blockDelegate[549:403] person dog 10 count 12012-09-03 11:21:10.554 blockDelegate[549:403] dog 10 bark count 22012-09-03 11:21:10.555 blockDelegate[549:403] person dog 10 count 22012-09-03 11:21:11.553 blockDelegate[549:403] dog 10 bark count 32012-09-03 11:21:11.554 blockDelegate[549:403] person dog 10 count 32012-09-03 11:21:12.554 blockDelegate[549:403] dog 10 bark count 42012-09-03 11:21:12.555 blockDelegate[549:403] person dog 10 count 42012-09-03 11:21:13.553 blockDelegate[549:403] dog 10 bark count 52012-09-03 11:21:13.553 blockDelegate[549:403] person dog 10 count 52012-09-03 11:21:14.553 blockDelegate[549:403] dog 10 bark count 62012-09-03 11:21:14.554 blockDelegate[549:403] person dog 10 count 6
分享到:
相关推荐
Block简介block 是一个 模块化的跨平台游戏服务器框架 ,通过不同的 组装方式可以适应大多数的架构。通常您只需要使用 lua 就能完成大部分的游戏逻辑编写,但是您也可以使用 c++ 来完成一些高密度计算的逻辑。特性...
大唐半导体-射频芯片设计部:1. 系统规范 IC SPEC定义? • 2. 实现Low Power? • 3. RF收发机(Transceiver)架构? • 4. RX通道Block简介? • 5. TX通道Block简介? • 6. Summary
插件简介:这个功能很方便外部集成。增加了 SQL 仅允许 SELECT查询语句限制,保证数据安全。 DIY数据模块中增加SQL语句查询调用,使DIY更实用。 打开portal_blockclass.php'sort' => lang('blockclass', 'block...
[关键字] 开源 IDE CodeBlocks CodeBlocks 简介: Code::Block、MinGW 和 wxWidgets 分别是三个著名的开源项目,分别是 IDE、编译器和界面库。由这三样搭建起来的全开源纯c++开发环境,功能不逊色于Visual C++,...
简介简介 Cloudflare Block Bad Bot Ruleset项目停止并阻止Bad Bot,垃圾邮件引荐Cloudflare Block Bad Bot Ruleset ,广告软件,恶意软件和任何其他类型的不良Internet流量,这些垃圾流量曾经到达您的网站。受启发...
【插件简介】 保持专注,提高工作效率。轻松拦截任何令人分心或有害的网站。彻底杜绝耽误时间!只需将网站添加到您的阻止列表中,剩下的我们就会做,如果您尝试在被阻止的网站上继续浏览,我们甚至会抛出一些非常...
简介 BlockCollect是一个兼具卡顿监测和远程收集日志的工具. 卡顿监测利用Android系统每隔16.6ms发出VSYNC信号,来通知界面进行重绘、渲染的原理. 远程收集日志利用Bugly这趟顺风车. 本地日志: 远程日志: ...
说明:规则文件名包括的开源项目简介Surge语法AD_Block.txt超过4万条广告规则, 阻止常见的APP广告/隐私/行为/数据/流量/劫持的统计和追踪.DOMAIN-SETAD_Block_Add.txt阻止广告联盟关键字和IP段, 建议和"AD_Block.txt...
【插件简介】 插件可以在AE软件中制作随机的打乱图像块。非常适合产生噪波效果,毛刺干扰小故障和过渡效果。源图像的像素块之间可以简单地交换,它们的大小,随机,数量和其他参数可以控制制作动画。 Randomly ...
适合ICEM进阶阶段者使用。 结构化网格和非结构化网格 ICEM中的O-Block分类和创建 ICEM高级使用技巧简介 ICEM中镜像生成结构化网格的3种方法 ICEM结构化与非结构化周期性网格生成方法
网页制作Webjx文章简介:去除inline-block元素间间距的N种方法。
压缩感知理论很全面的介绍,适合初学者,简单易懂
网页制作Webjx文章简介:这篇文章所讲的也是非常使用的技术,其中牵涉到其他的技术,也需要大家有所了解。正好这两天也在看这方面的资料,提供一些资料给大家参考。 啊,inline-block,挺难琢磨并且迷人的声明上承诺...
FPGA采用了逻辑单元阵列LCA(Logic Cell Array)这样一个新概念,内部包括可配置逻辑模块CLB(Configurable Logic Block)、输出输入模块IOB(Input Output Block)和内部连线(Interconnect)三个部分。
通过对Simulink模型添加信号约束模块(Signal Constraint block)可以优化已知输入的模型响应。Simulink设计优化软件(Simulink Design Optimization software)通过调整模型的参数来满足指定的约束,其中包括信号...
Bem 是块(block)、元素(element)、修饰符(modifier)的简写,由 Yandex 团队提出的一种前端 CSS 命名方法论。 BEM 是一个简单又非常有用的命名约定。让你的前端代码更容易阅读和理解,更容易协作,更容易控制,...
支承块 spacer block; 10.型芯 core; 11.螺钉 screw;12.动模座板 clamping plate of moving mould; 13. 顶杆固定板 ejector-retainer plate;14.拉料杆 sprue puller pin; 15.顶杆垫板 ejector-support plate; 16....
FPGA采用了逻辑单元阵列LCA(Logic Cell Array)这样一个新概念,内部包括可配置逻辑模块CLB(Configurable Logic Block)、输出输入模块IOB(Input Output Block)和内部连线(Interconnect)三个部分。...
数据访问应用程序块(DAAB)预发布简介:数据访问应用程序块抽象了您正在使用的实际数据库,并公开了使您可以轻松访问该数据库和执行常见任务的方法的集合。 该块旨在简化调用存储过程的任务,但它也提供对使用参数...