• 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;

    }

  • 相关阅读:
    回家了
    AMP > Chapter 3 Concurrent Objects > Notes<1>
    Readings in Database Systems
    读书笔记:《Transaction Processing》Chapter 13 Buffer Management

    委托和事件的区别
    .net网页不完整的解决方案
    聚集索引,非聚集索引
    固定宽度下拉列表中option内容显示不全问题解决方法
    让你的Windows系统自动释放系统资源
  • 原文地址:https://www.cnblogs.com/yyt-hehe-yyt/p/7693877.html
Copyright © 2020-2023  润新知