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

    }

  • 相关阅读:
    浙江省新一代多普勒天气雷达系统
    删除目录下的所有文件及子文件夹
    在南京14所测试出厂雷达(转)
    c++实现aes加密算法,对字符串进行加密
    自已在别人基础上封装的AES数法 C++
    IOS发布问题
    GameCenter 使用指南
    [iOS]AES加密在iOS上面的实现
    【iOS开发必收藏】详解iOS应用程序内使用IAP/StoreKit付费、沙盒(SandBox)测试、创建测试账号流程!【2012625日更新iap恢复详解】
    基于cocos2dx引擎的游戏框架设计
  • 原文地址:https://www.cnblogs.com/yyt-hehe-yyt/p/7693877.html
Copyright © 2020-2023  润新知