• Block的使用


    1.block的原型及定义:

    NSString * ( ^ myBlock )( int );
    myBlock = ^( int paramA )
    {
        return [ NSString stringWithFormat: @"Passed number: %i", paramA ];
    };
    myBlock(7);

    2.

    Block作为函数参数:
    
    1 // .h
    2 -(void) testBlock:( NSString * ( ^ )( int ) )myBlock;
    3 // .m
    4 -(void) testBlock:( NSString * ( ^ )( int ) )myBlock
    5 {
    6     NSLog(@"Block returned: %@", myBlock(7) );
    7 }

    3.block中改变变量的值:

    __block int x;

    对于用__block修饰的外部变量引用,block是复制其引用地址来实现访问的.

    4.编译器如何编译:

    #import typedef void(^BlockA)(void);
    __attribute__((noinline))
    void runBlockA(BlockA block) {
        block();
    }
    void doBlockA() {
        BlockA block = ^{
            // Empty block
        };
        runBlockA(block);
    }

    定义了一个名为BlockA的block类型,该block在函数doBlockA中实现,并将其作为函数runBlockA的参数,最后在函数doBlockA中调用函数runBloackA。

    注意:

    如果block的创建和调用都在一个函数里面,那么优化器(optimiser)可能会对代码做优化处理,从而导致我们看不到编译器中的一些操作,所以用__attribute__((noinline))给函数runBlockA添加noinline,这样优化器就不会在doBlockA函数中对runBlockA的调用做内联优化处理。

    5. copy()和dispose():

    如果我们想要在以后继续使用某个block,就必须要对该block进行拷贝操作,即从栈空间复制到堆空间。所以拷贝操作就需要调用Block_copy()函数,block的descriptor中有一个copy()辅助函数,该函数在Block_copy()中执行,用于当block需要拷贝对象的时候,拷贝辅助函数会retain住已经拷贝的对象。

    既然有有copy那么就应该有release,与Block_copy()对应的函数是Block_release(),它的作用不言而喻,就是释放我们不需要再使用的block,block的descriptor中有一个dispose()辅助函数,该函数在Block_release()中执行,负责做和copy()辅助函数相反的操作,例如释放掉所有在block中拷贝的变量等。

    每天进步一点点......

  • 相关阅读:
    RN的win7开发环境部署和问题解决
    Android EditText弹出软键盘实现页面标题头不动,软键盘弹出在编辑框下面
    android打包生成apk时自定义文件名版本号。自定义项目字段等等
    Android ConstraintLayout 约束布局属性
    AS基本设置
    PermissionUtils
    kotlin之字符串模板
    kotlin之字符串
    kotlin之数组
    kotlin之布尔类型
  • 原文地址:https://www.cnblogs.com/pengsi/p/5331734.html
Copyright © 2020-2023  润新知