zoukankan      html  css  js  c++  java
  • iOS开发——Block使用小结

      Block语法看上去好像很特别,但它实际上是作为极普通的C语言源代码处理的。Block的实质,就是Objective-C的对象。

      1、Block的语法

      ^ 返回值类型 参数列表 表达式

      可省略返回值类型:^ 参数列表 表达式。省略返回值类型时,如果表达式中有return语句就使用该返回值的类型,如果表达式中没有return语句,就使用void类型。

      再省略参数列表:^ 表达式。这个就是大家最熟知的记叙方式。

        int val = 10;

        void (^blk)(void) = ^{

            printf("val = %d ",val);

        };

        blk();

      2、__block说明符

      若想在Block语法的表达式中将值赋给在Block语法外声明的自动变量,需要在该自动变量上附加__block说明符。不然就会产生编译错误。

        __block int val = 10;

        void (^blk)(void) = ^{

            val = 11;

        };

        blk();

        printf("val = %d ",val);

      

      3、Block循环引用

      先看看下面的源代码吧!

    typedef void(^blk_t)(void);

    @interface MyObject : NSObject{

        blk_t blk_;

    }

    @end

    @implementation MyObject

    - (id)init {

        self = [super init];    

        blk_ = ^{

            NSLog(@"self = %@",self);

        };

        return self;

    }

    @end

      MyObject类对象的Block类型成员变量blk_持有赋值为Block的强引用。即MyObject类对象持有Block。init实例方法中执行的Block语法使用持有__strong修饰符的id类型变量self。并且由于Block语法赋值在了成员变量blk_中,因此通过Block语法生成在栈上的Block此时由栈复制到堆,并持有所使用的self。self持有Block,Block持有self。这正是循环引用。

      为避免循环引用,可声明附有__weak修饰符的变量,并将self赋值使用。

    - (id)init {

        self = [super init];

        id __weak tmp = self;

        blk_ = ^{

            NSLog(@"self = %@",tmp);

        };

        return self;

    }

  • 相关阅读:
    QMainWindow透明背景
    在Xcode中产看QString的数据
    使用QtConcurrent在线程池中执行网络操作
    QThread和QObject的调用方法总结
    策略模式 C++实现
    【转】单元测试要做多细?
    Mac系统添加QQ邮箱帐号提示无法验证
    Qt半透明对话框
    SVD的几何意义,以及在去噪,推荐系统中的应用
    BP神经网络原理及python实现
  • 原文地址:https://www.cnblogs.com/yyt-hehe-yyt/p/7693877.html
Copyright © 2011-2022 走看看