31-关于block

作者: 评评分分 | 来源:发表于2015-09-09 19:59 被阅读570次

    在iOS开发中我们在很多地方都能见到block的身影

    (1)遍历数组或者字典

    (2)视图动画

    (3)排序

    (4)通知

    (5)错误处理

    (6)多线程

    (7)封装变化点


    什么是block

    对于闭包(block),有很多定义,其中闭包就是能够读取其它函数内部变量的函数,这个定义即接近本质又较好理解。对于刚接触Block的同学,会觉得有些绕,因为我们习惯写这样的程序main(){ funA();} funA(){funB();} funB(){…..}; 就是函数main调用函数A,函数A调用函数B… 函数们依次顺序执行,但现实中不全是这样的,例如项目经理M,手下有3个程序员A、B、C,当他给程序员A安排实现功能F1时,他并不等着A完成之后,再去安排B去实现F2,而是安排给A功能F1,B功能F2,C功能F3,然后可能去写技术文档,而当A遇到问题时,他会来找项目经理M,当B做完时,会通知M,这就是一个异步执行的例子。在这种情形下,Block便可大显身手,因为在项目经理M,给A安排工作时,同时会告诉A若果遇到困难,如何能找到他报告问题(例如打他手机号),这就是项目经理M给A的一个回调接口,要回掉的操作,比如接到电话,百度查询后,返回网页内容给A,这就是一个Block,在M交待工作时,已经定义好,并且取得了F1的任务号(局部变量),却是在当A遇到问题时,才调用执行,跨函数在项目经理M查询百度,获得结果后回调该block

    block 实现原理

    Objective-C是对C语言的扩展,block的实现是基于指针和函数指针。

    从计算语言的发展,最早的goto,高级语言的指针,到面向对象语言的block,从机器的思维,一步步接近人的思维,以方便开发人员更为高效、直接的描述出现实的逻辑(需求)。

    下面是两篇很好的介绍block实现的博文

    iOS中block实现的探究

    谈Objective-C Block的实现


    3 block的使用

    使用实例

    cocoaTouch框架下动画效果的Block的调用

    使用typed声明block

    typedef void(^didFinishBlock) (NSObject *ob);

    这就声明了一个didFinishBlock类型的block,

    然后便可用

    @property (nonatomic,copy) didFinishBlock finishBlock;

    声明一个blokc对象,注意对象属性设置为copy,接到block 参数时,便会自动复制一份。

    __block是一种特殊类型,

    使用该关键字声明的局部变量,可以被block所改变,并且其在原函数中的值会被改变。

    相关文章

      网友评论

      • 评评分分:关于block使用的5点注意事项
        1、在使用block前需要对block指针做判空处理。不判空直接使用,一旦指针为空直接产生崩溃
        2、在MRC的编译环境下,block如果作为成员参数要copy一下将栈上的block拷贝到堆上
        3、在block使用之后要对,block指针做赋空值处理,如果是MRC的编译环境下,要先release掉block对象。block作为类对象的成员变量,使用block的人有可能用类对象参与block中的运算而产生循环引用。将block赋值为空,是解掉循环引用的重要方法。(不能只在dealloc里面做赋空值操作,这样已经产生的循环引用不会被破坏掉)
        4、使用方将self或成员变量加入block之前要先将self变为__weak
        5、在多线程环境下(block中的weakSelf有可能被析构的情况下),需要先将self转为strong指针,避免在运行到某个关键步骤时self对象被析构。

      本文标题:31-关于block

      本文链接:https://www.haomeiwen.com/subject/kelpcttx.html