`
ydbc
  • 浏览: 719572 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

block 简介

 
阅读更多
一、什么是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的几个小例子


Java代码收藏代码
  1. #import<Cocoa/Cocoa.h>
  2. intmain(intargc,char*argv[])
  3. {
  4. @autoreleasepool{
  5. NSLog(@"Helloworld");
  6. void(^myblocks)(void)=NULL;
  7. myblocks=^(void){
  8. NSLog(@"inblocks");
  9. };
  10. NSLog(@"beforemyblocks");
  11. myblocks();
  12. NSLog(@"aftermyblocks");
  13. int(^myblocks2)(inta,intb)=^(inta,intb){
  14. intc=a+b;
  15. returnc;
  16. };
  17. NSLog(@"beforeblocks2");
  18. intret=myblocks2(10,20);
  19. NSLog(@"afterblocks2ret%d",ret);
  20. //此处如果不加__block会报错
  21. __blockintsum=0;
  22. int(^myblocks3)(inta,intb)=^(inta,intb){
  23. sum=a+b;
  24. return3;
  25. };
  26. myblocks3(20,30);
  27. NSLog(@"sumis%d",sum);
  28. }
  29. returnNSApplicationMain(argc,(constchar**)argv);
  30. }

打印结果如下
2012-09-03 10:23:20.878 blockTest[407:403] Hello world
2012-09-03 10:23:20.880 blockTest[407:403] before myblocks
2012-09-03 10:23:20.881 blockTest[407:403] in blocks
2012-09-03 10:23:20.881 blockTest[407:403] after myblocks
2012-09-03 10:23:20.882 blockTest[407:403] before blocks2
2012-09-03 10:23:20.882 blockTest[407:403] after blocks2 ret 30
2012-09-03 10:23:20.882 blockTest[407:403] sum is 50

七、block写的回调例子
1、Dog.h
Java代码收藏代码
  1. #import<Foundation/Foundation.h>
  2. @interfaceDog:NSObject{
  3. int_ID;
  4. NSTimer*timer;
  5. intbarkCount;
  6. //定义一个blocks变量
  7. void(^BarkCallback)(Dog*thisDog,intcount);
  8. }
  9. @property(assign)intID;
  10. //向外暴露一个接口
  11. -(void)setBark:(void(^)(Dog*thisDog,intcount))eachBark;
  12. @end

2、Dog.m
Java代码收藏代码
  1. #import"Dog.h"
  2. @implementationDog
  3. @synthesizeID=_ID;
  4. -(id)init
  5. {
  6. self=[superinit];
  7. if(self){
  8. //每隔1s调用一次updateTimer方法
  9. timer=[NSTimerscheduledTimerWithTimeInterval:1.0ftarget:selfselector:@selector(updateTimer:)userInfo:nilrepeats:YES];
  10. }
  11. returnself;
  12. }
  13. -(void)updateTimer:(id)arg
  14. {
  15. barkCount++;
  16. NSLog(@"dog%dbarkcount%d",_ID,barkCount);
  17. //向Person对象进行汇报
  18. if(BarkCallback){
  19. //调用从Person传过来的Blocks
  20. BarkCallback(self,barkCount);
  21. }
  22. }
  23. -(void)setBark:(void(^)(Dog*,int))eachBark
  24. {
  25. [BarkCallbackrelease];
  26. BarkCallback=[eachBarkcopy];
  27. }
  28. -(void)dealloc
  29. {
  30. [BarkCallbackrelease];
  31. [superdealloc];
  32. }
  33. @end


3、Person.h
Java代码收藏代码
  1. #import<Foundation/Foundation.h>
  2. #import"Dog.h"
  3. @interfacePerson:NSObject
  4. {
  5. Dog*_dog;
  6. }
  7. @property(retain)Dog*dog;
  8. @end


4、Person.m

Java代码收藏代码
  1. #import"Person.h"
  2. @implementationPerson
  3. @synthesizedog=_dog;
  4. -(void)setDog:(Dog*)dog
  5. {
  6. if(_dog!=dog){
  7. [_dogrelease];
  8. _dog=[dogretain];
  9. [_dogsetBark:^(Dog*thisDog,intcount){
  10. NSLog(@"persondog%dcount%d",[thisDogID],count);
  11. }];
  12. }
  13. }
  14. -(Dog*)dog
  15. {
  16. return_dog;
  17. }
  18. -(void)dealloc
  19. {
  20. self.dog=nil;
  21. [superdealloc];
  22. }
  23. @end



5、Main.m
Java代码收藏代码
  1. #import<Foundation/Foundation.h>
  2. #import"Person.h"
  3. #import"Dog.h"
  4. intmain(intargc,constchar*argv[])
  5. {
  6. @autoreleasepool{
  7. //insertcodehere...
  8. NSLog(@"Hello,World!");
  9. Person*person=[[Personalloc]init];
  10. Dog*dog=[[Dogalloc]init];
  11. [dogsetID:10];
  12. [personsetDog:dog];
  13. [dogrelease];
  14. while(1){
  15. [[NSRunLoopcurrentRunLoop]run];
  16. }
  17. [personrelease];
  18. }
  19. return0;
  20. }


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 1
2012-09-03 11:21:09.555 blockDelegate[549:403] person dog 10 count 1
2012-09-03 11:21:10.554 blockDelegate[549:403] dog 10 bark count 2
2012-09-03 11:21:10.555 blockDelegate[549:403] person dog 10 count 2
2012-09-03 11:21:11.553 blockDelegate[549:403] dog 10 bark count 3
2012-09-03 11:21:11.554 blockDelegate[549:403] person dog 10 count 3
2012-09-03 11:21:12.554 blockDelegate[549:403] dog 10 bark count 4
2012-09-03 11:21:12.555 blockDelegate[549:403] person dog 10 count 4
2012-09-03 11:21:13.553 blockDelegate[549:403] dog 10 bark count 5
2012-09-03 11:21:13.553 blockDelegate[549:403] person dog 10 count 5
2012-09-03 11:21:14.553 blockDelegate[549:403] dog 10 bark count 6
2012-09-03 11:21:14.554 blockDelegate[549:403] person dog 10 count 6


分享到:
评论

相关推荐

    block:游戏服务器框架,组件结构,支持lua

    Block简介block 是一个 模块化的跨平台游戏服务器框架 ,通过不同的 组装方式可以适应大多数的架构。通常您只需要使用 lua 就能完成大部分的游戏逻辑编写,但是您也可以使用 c++ 来完成一些高密度计算的逻辑。特性...

    NB-IoT产业峰会PPT

    大唐半导体-射频芯片设计部:1. 系统规范 IC SPEC定义? • 2. 实现Low Power? • 3. RF收发机(Transceiver)架构? • 4. RX通道Block简介? • 5. TX通道Block简介? • 6. Summary

    DIY功能增强插件for Discuz!X1.rar

    插件简介:这个功能很方便外部集成。增加了 SQL 仅允许 SELECT查询语句限制,保证数据安全。 DIY数据模块中增加SQL语句查询调用,使DIY更实用。 打开portal_blockclass.php'sort' =&gt; lang('blockclass', 'block...

    Code::Block for puppy linux

    [关键字] 开源 IDE CodeBlocks CodeBlocks 简介:  Code::Block、MinGW 和 wxWidgets 分别是三个著名的开源项目,分别是 IDE、编译器和界面库。由这三样搭建起来的全开源纯c++开发环境,功能不逊色于Visual C++,...

    cloudflare-block-bad-bot-ruleset:使用Cloudflare防火墙规则阻止恶意爬网程序

    简介简介 Cloudflare Block Bad Bot Ruleset项目停止并阻止Bad Bot,垃圾邮件引荐Cloudflare Block Bad Bot Ruleset ,广告软件,恶意软件和任何其他类型的不良Internet流量,这些垃圾流量曾经到达您的网站。受启发...

    BlockSite 网站拦截程序 | 谷歌(Chrome)浏览器插件

    【插件简介】 保持专注,提高工作效率。轻松拦截任何令人分心或有害的网站。彻底杜绝耽误时间!只需将网站添加到您的阻止列表中,剩下的我们就会做,如果您尝试在被阻止的网站上继续浏览,我们甚至会抛出一些非常...

    Android代码-an android block collection by bugly car

    简介 BlockCollect是一个兼具卡顿监测和远程收集日志的工具. 卡顿监测利用Android系统每隔16.6ms发出VSYNC信号,来通知界面进行重绘、渲染的原理. 远程收集日志利用Bugly这趟顺风车. 本地日志: 远程日志: ...

    ND-AD:由多个开源项目集成的广告规则

    说明:规则文件名包括的开源项目简介Surge语法AD_Block.txt超过4万条广告规则, 阻止常见的APP广告/隐私/行为/数据/流量/劫持的统计和追踪.DOMAIN-SETAD_Block_Add.txt阻止广告联盟关键字和IP段, 建议和"AD_Block.txt...

    AE/PR插件-随机生成像素块视觉特效 Block Swap v1.5 Win/Mac

    【插件简介】 插件可以在AE软件中制作随机的打乱图像块。非常适合产生噪波效果,毛刺干扰小故障和过渡效果。源图像的像素块之间可以简单地交换,它们的大小,随机,数量和其他参数可以控制制作动画。 Randomly ...

    ICEM 高级使用技巧

    适合ICEM进阶阶段者使用。 结构化网格和非结构化网格  ICEM中的O-Block分类和创建  ICEM高级使用技巧简介  ICEM中镜像生成结构化网格的3种方法  ICEM结构化与非结构化周期性网格生成方法 

    inline-block元素间距去除掉方法介绍(图文教程)

    网页制作Webjx文章简介:去除inline-block元素间间距的N种方法。

    压缩感知理论简介

    压缩感知理论很全面的介绍,适合初学者,简单易懂

    CSS教程:inline-block在各浏览器的显示

    网页制作Webjx文章简介:这篇文章所讲的也是非常使用的技术,其中牵涉到其他的技术,也需要大家有所了解。正好这两天也在看这方面的资料,提供一些资料给大家参考。 啊,inline-block,挺难琢磨并且迷人的声明上承诺...

    可编程门阵列FPGA的基本原理简介

    FPGA采用了逻辑单元阵列LCA(Logic Cell Array)这样一个新概念,内部包括可配置逻辑模块CLB(Configurable Logic Block)、输出输入模块IOB(Input Output Block)和内部连线(Interconnect)三个部分。

    Signal Constraint使用方法简介

    通过对Simulink模型添加信号约束模块(Signal Constraint block)可以优化已知输入的模型响应。Simulink设计优化软件(Simulink Design Optimization software)通过调整模型的参数来满足指定的约束,其中包括信号...

    CSS BEM 命名规范简介(推荐)

    Bem 是块(block)、元素(element)、修饰符(modifier)的简写,由 Yandex 团队提出的一种前端 CSS 命名方法论。 BEM 是一个简单又非常有用的命名约定。让你的前端代码更容易阅读和理解,更容易协作,更容易控制,...

    注塑模具简介及实例.doc

    支承块 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....

    EDA/PLD中的FPGA 简介

    FPGA采用了逻辑单元阵列LCA(Logic Cell Array)这样一个新概念,内部包括可配置逻辑模块CLB(Configurable Logic Block)、输出输入模块IOB(Input Output Block)和内部连线(Interconnect)三个部分。...

    data-access-application-block

    数据访问应用程序块(DAAB)预发布简介:数据访问应用程序块抽象了您正在使用的实际数据库,并公开了使您可以轻松访问该数据库和执行常见任务的方法的集合。 该块旨在简化调用存储过程的任务,但它也提供对使用参数...

Global site tag (gtag.js) - Google Analytics