在现阶IOBlock 是iOS在4.0之后新增的程式语法,严格来说block的概念并不算是基础程式设计的范围,对初学者来说也不是很容易了解,但是在iOS SDK 4.0之后,block几乎出现在所有新版的API之中,换句话说,如果不了解block这个概念就无法使用SDK 4.0版本以后的新功能,所以我们必须要熟练掌握block的使用

  1、正则开始我们先认识一下如何来定义一个简单的block

        //1 无参数无返回值
void (^ MyBlock1)(void); //2 有参数无返回值
void (^ MyBlock2)(int a,int b); //3 有参数有返回值
int (^ MyBlock3)(int a,int b);

  2、针对block的声明,我们如何真正意义上的实现他呢?下面我们探讨一下如何实现一个有功能的block,我们拿第一个为例子

   void (^ MyBlock1)(void)=^(void){

            NSLog(@"这是我的第一个block");

  };

  这样我们就成功的实现了一个bock,上面是针对了没有返回值的block,针对有返回值的如何实现呢,同样的类似于函数,你只要在最后返回即可了,比如我们用第三个距离,返回两个数之间的和

      int  (^ MyBlock3)(int a,int b)=^(int a,int b ){

            return a+b;

        };

  3、上面我们完成了block得定义和实现,下面我们会考虑如何使用他了吧,其实使用bock是非常简单的,我们只需要按照使用函数那样使用就可以了,如下所示

        // 调用block1(无返回值无参数)
MyBlock1(); // 调用block3(有返回值有参数)
int value= MyBlock3(,);

  4、block作为参数,在开发app的时候你会发现很多情况下都是block作为参数,这也是block的广泛应用之一,下面我们看看如何让block在作为参数,现在我们定义Dog对象,DOG对象里面有属性和行为,如下

  同时定义一个主人类,主人拥有狗,主人可以对狗发布指令,狗根据不同的指令来执行不同的操作,这里我们采取块的形式,将指令通过块传递信息,此时我们就需要用到块作为参数:

实现部分如下

在main函数中,我们按照如下方式引用即可

    Host * host=[[Host alloc] init];
Dog * dog=[[Dog alloc] init];
dog.name=@"dahuang";
host.dog=dog; //0 将指令封装到block中然后传递信息
void (^ myDog)(Dog *dog)= ^(Dog *dog) {
[dog run];
[dog canBark];
[dog speakName];
}; //1 告诉狗要做的事情
[host askDog:myDog]; //2 让狗去做
[host toDo];

  5、__block 关键字,block可以作为参数进行传递,因此block的执行时机可能不是很确定,所以当我们需要在block里面,将执行的结果赋值给外面的变量的时候需要注意一点,如果想把block的结果赋值给局部变量,则会报错,原因是当你执行block的时候你的局部变量可能已经销毁了,所有block的不能直接给局部变量赋值,当然如果是全局变量是可以的。Block还引入了另一种关键字,将局部变量的生命周期变为和全局变量一样即可,这样我们就能给局部变量赋值了,如下所示:

    __block int sum=;

        void (^ myBlock) (int,int)=^(int a ,int b){

            sum=a+b;
};
作者:杰瑞教育
出处:http://www.cnblogs.com/jerehedu/ 
版权声明:本文版权归烟台杰瑞教育科技有限公司和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

技术咨询:
 

最新文章

  1. jQuery源码分析系列(31) : Ajax deferred实现
  2. python入门练习题3(函数)
  3. phpcms评论的url替换问题
  4. asp:gridview 中显示日期格式
  5. JavaEE基础(六)
  6. C# 学习笔记03 DataTable
  7. 蒋金楠How ASP.NET MVC Works?[持续更新中…]
  8. 转载:简化IT程序员工作生活的4个窍门
  9. Delphi 6 Web Services初步评估之三(转)
  10. Top k问题(线性时间选择算法)
  11. NOI2014 Day1
  12. D7升级时候发现许多System函数和网络函数只有Byte版本的,需要注意
  13. ArcGIS制图表达Representation实战篇3-控制点
  14. 基本数据结构——堆(Heap)的基本概念及其操作
  15. 最新Hadoop Shell完全讲解
  16. win10 uwp 隐藏实时可视化
  17. Nestjs 上传文件
  18. docker,docker-compose部署服务器
  19. vi中批量加注释
  20. POJ 1751 Highways 【最小生成树 Kruskal】

热门文章

  1. git merge和git rebase的区别(转)
  2. [luogu4459][BJOI2018]双人猜数游戏(DP)
  3. 渗透测试中的bypass技巧
  4. bzoj 1027 floyd求有向图最小环
  5. bzoj 3671 贪心
  6. IO流-递归遍历目录下指定后缀名结尾的文件名称
  7. Redis系列之(一):10分钟玩转Redis
  8. rpm管理环境包和代码包
  9. Linux内核hlist数据结构分析
  10. c#中何时使用Empty()和DefalutIfEmpty()