美文网首页
深入理解Block

深入理解Block

作者: fever105 | 来源:发表于2016-07-29 09:56 被阅读118次

深入理解Block


  • block的灵活之处:能够从函数外部访问函数内部的变量

  • 如果有返回值,block的声明和实现语法略有不同:

    • 声明
    // 返回类型 (^block变量名)(参数类型);
    CGFloat (^myBlock)(NSObject *);
    
    • 实现
    // ^返回类型(参数类型 参数名)
    ^CGFloat(NSObject *obj) {
       /**
       实现block
       */
    };
    
    • 做参数
    // (返回类型 (^)(参数类型))block变量名;
    (CGFloat (^)(NSObject *))myBlock;
    

  • 利用block实现回调方法,作为属性的block会被保存到堆,等待被调用时执行。

  • block的typedef格式同其他类型不同:
/**
 typedef 原始类型 新类型
 */
typedef int intType;

/**
 typedef 返回类型 (^block类型名)(参数类型)
 */
typedef CGFloat(^myBlock)(NSString *str);

  • 直接设置对象的block属性,编译器不提示block类型。解决方法:
    1. 利用typedef定义所需的block类型。
    2. 将block属性划为私有
    3. 提供一个setBlock方法,用来设置block属性。

/**
 1. 定义block类型(.h)
 */
typedef void(^RAPWebImageDownloadHandler)(RAPWebImageDownloadOperation *op);

/**
 2. 提供一个设置block属性的方法(.h)
 */
- (void)setWebImageDownloadHandler:(RAPWebImageDownloadHandler)handler;

/**
 3. 将block属性划为私有(.m)
 */
@property (nonatomic, copy) RAPWebImageDownloadHandler handler;

// 4. 方法实现(.m)
- (void)setWebImageDownloadHandler:(RAPWebImageDownloadHandler)handler
{
    self.handler = handler;
}


  • 在 block 中使用 self 前,要先判断是否为空,如果为空,则返回,否则,继续执行后续逻辑;尽管在 OC 中,向 nil 发消息没问题,但是,如果后续逻辑包含数据操作,那么就会出现界面未改变,但数据已经发生变化的情况
        // 弱引用 self
    __weak __typeof(&*self)weakSelf = self;
    [DDPhpClient request:@"http://www.baidu.com" params:nil completion:^(NSError *err, id returnData) {
        if (self == nil) return;
        // 其它业务逻辑
        UIViewController *vc = [UIViewController new];
        [self presentViewController:vc animated:YES completion:nil];
    }];

相关文章

  • 【iOS开发】一些不错的文章博客整理

    持续更新... RunLoop ibireme深入理解RunLoop Block 声明Block 组件化 iOS组...

  • 深入理解Block

    一.Block概要 什么是Block Block objects are a C-level syntactic ...

  • 深入理解 Block

    本文主要根据《Objective-C高级编程》这本书中的第二章来进行的一个总结,其中包含了查看其它文章后的总结和自...

  • 深入理解Block

    深入理解Block block的灵活之处:能够从函数外部访问函数内部的变量。 如果有返回值,block的声明和实现...

  • Block深入理解

    block 你应该了解的知识 为什么不把本部分放到本质部分的下面呢,我以为实用为大,还是先把block的使用及其注...

  • 深入理解Block

    什么是block 带有自动变量(局部变量)的匿名函数。它是C语言的扩充功能 block本质上是一个OC对象,它内部...

  • 深入理解Block

    目录 1.block的内部结构 2.捕获变量 3.block的类型 3.循环引用 一、block的内部结构 blo...

  • block深入理解

    https://juejin.cn/post/6844903893176958983

  • hbase资料收集

    一、HBase 0.94.1 block-cache 理解 二、HBase深入学习(1) 三、HBase深入学习(...

  • Block源码解析和深入理解

    Block源码解析和深入理解 Block的本质 Block是"带有自动变量值的匿名函数". 我们通过Clang(L...

网友评论

      本文标题:深入理解Block

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