zoukankan      html  css  js  c++  java
  • 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中拷贝的变量等。

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

  • 相关阅读:
    docker学习-docker核心技术
    Ecmall 中国地区设置
    lazyload.js实现图片异步载入
    inpyt 按钮变透明 边框
    vertical-align0 垂直对齐- 图片 兼容个浏览器
    div文字超出
    jquery满屏滚动代码
    $().index() 两种用法
    setTimeout不断重复执行
    background属性
  • 原文地址:https://www.cnblogs.com/pengsi/p/5331734.html
Copyright © 2011-2022 走看看