OC_关于block的使用

如果你阅读了我的上一篇博客《OC protocol的使用》的话,我想 你应该明白了监听器的基本工作原理。我们首先展示了Java中interface的
使用 ,并使用interface实现了监听器。为了对比,我们在oc中使用protocol来实现了同样的功能。不知道各位读者有没有注意到无论是Java
的实现还是oc的实现,都是每次定义一个监听器时需要重新定义一个监听器类,很是麻烦。那有没有更好的,更简洁,而且功能同样强大的
语法呢?当然有,本节我们依然使用Java和oc的语法进行对比,一期望能够让各位读者能够更加清晰直观理解我们要讲的内容。在Java中我们
通过接口+匿名内部类来实现而在oc中我们则通过block来实现:
我们还是首先来看Java的实现方法:
1、定义接口
public interface Interface {
 public void test(int i);
 public void test2();
}
2、定义需要监听的类
public class Button {
 private Interface face;

 public Interface getFace() {
  return face;
 }

 public void setFace(Interface face) {
  this.face = face;
 }
 
 public void onClick(int id){
  face.test(id);
 }
}
使用匿名内部类为Button设置监听器
public static void main(String[] args) {
 Button bu = new Button();
 bu.setFace(
   new Interface(){

    @Override
    public void test(int i) {
     System.out.println("button:" + i +"click");
    }

    @Override
    public void test2() {}
    
   });
}
看到以上代码,我相信每一个有经验的程序员对此都不会陌生。匿名内部类是接口的实现子类。这个匿名内部类的实现类与上一节同样的功能
我们可以清楚地看到代码简洁灵活了不少。那么oc也一定具有类似的机制---代码块。当然两者还是有不少区别的,是首先一个是类而另一个
却更像是函数。其次一个需要实现接口中的方法,而另一个却是实现块的内容,还有一个返回新建对象另一个返回返回值........既然如此,那
我们还是一如既往,让我首先来看看代码:

从上面我们可以清晰的看到一个最基本的block的定义。我们首先需要定义block的类型,然后在等号的右面写一个匿名的类型的定义就可以了,他就像

函数一样,有参数和返回值(当然也可以不使用参数列表已经返回值),在调用的时候使用声明式里定义的名字然后填写参数接收返回值,就可以了。

如果熟悉Java的读者应该知道Java的内部类是不能访问局部变量的(当然如果局部变量是final的也是可以的),但是我们通过上面的代码可以清晰的看到

在block内部是完全可以访问的。但是我们有一个问题上面的代码展示的内容仅仅是表明了可以读取,那么是不是可以修改呢?不确定?没关系,我们写

段代码试一试就知道了:

通过上面的代码我们可以明显的看到,block内部对局部变量只有读权限没有写权限,那么我们真的就没有办法来在block的内部对局部变量进行些操作了吗?

看代码:

通过以上代码我们可以看到如果我们想在block内部对局部变量进行写操作,那么我们就需要对局部变量添加__block修饰;

不知道大家有没有觉得在上述代码中每次声明block都需要先声明他的形式,在定义时还需要声明匿名类型,很麻烦。那么有没有一种简洁

的办法,可以实现同样的功能呢?当然是有的。不知道大家是否还记得typedef的作用以及其用法。typedef就是定义一种新的类型,具体的

使用方法看代码:

通过以上代码我们使用typedef定义一种新的类型,使用新的类型再进行声明以及定义,我们可以看得出来确实简洁了不少。

还记得在本文刚开始时我们使用Java通过匿名内部类模拟了监听器的使用,目的就是引出OC中使用block以相似的方式完成同样的功能,那么使用block应该

如何来模拟呢?看代码:

1、我们首先定义一个Button类,在类中声明一个block来作为我们监听器的回调方法。

2、接下来我们定义这个类,利用onClick方法来模拟Button的点击事件

3、在主方法中我们首先定义一个Button对象,然后为Button的监听器(一个block对象)进行实现并赋值给Button中的block对象,最后

我们模拟Button的点击事件,结果正如我们所料:

通过以上的演示,相信各位读者都已经对block的用法有了一定的理解,也应该能对block进行基本的使用了,好了那么本节的讲解到此就要

结束了,希望大家看过之后勤加练习

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值