• iOS block


    对于大多数人来讲,block内部到底是怎样实现的呢?我们可以借助clang将其编译成为c++的代码,就可以看出,block到底是什么东西,

    先来看这样一个问题,

    <!-- lang: cpp -->
            int age = 10;
        void (^block)() = ^{
            NSLog(@"%d",age);
        };
        age  = 30;
        block();//10
    

    以及下面的这一段代码

    <!-- lang: cpp -->
            __block int age = 10;
        void (^block)() = ^{
            NSLog(@"%d",age);
        };
        age  = 30;
        block();//30
    

    你会发现这两个结果是不同的, 
    第一个输出10,第二个输出的是30

    要想知道这里面干了些什么!需要我们将其编译成为C++代码,看下里面到底搞了些什么? 
    使用终端,转到mian.m文件下,使用如下代码 clang -rewrite-objc main.m 将其编译生成 main.cpp文件 
    这时候,我们打开mian.cpp便知 在文件的最底下main函数中

    <!-- lang: cpp -->
    int main(int argc, const char * argv[])
    

    {

    /* @autoreleasepool */ { __AtAutoreleasePool __autoreleasepool; 
    
        __attribute__((__blocks__(byref))) __Block_byref_age_0 age = {(void*)0,(__Block_byref_age_0 *)&age, 0, sizeof(__Block_byref_age_0), 10};
        void (*block)() = (void (*)())&__main_block_impl_0((void *)__main_block_func_0, &__main_block_desc_0_DATA, (__Block_byref_age_0 *)&age, 570425344);
        (age.__forwarding->age) = 30;
        ((void (*)(__block_impl *))((__block_impl *)block)->FuncPtr)((__block_impl *)block);
    
    }
    return 0;
    

    }

    block内部是调用了一个结构体中的函数: 
    static struct main_block_desc_0 { 
    size_t reserved; 
    size_t Block_size; 
    void (copy)(struct __main_block_impl_0, struct 
    main_block_impl_0); 
    void (
    dispose)(struct __main_block_impl_0*); 
    }

    然后经过分析该c++文件我们知道 
    block实际上是: 指向结构体的指针 
    编译器会将block的内部代码生成对应的函数

    而在mian.m中,调用普通的int变量时,传过来的age其实是一个值传递,而__block则是引用传递! 
    所以,才是如上的结果!

    1
  • 相关阅读:
    263 相对布局之3— 相对布局的综合案例
    262 相对布局之2— 相对布局的属性设置
    leetcode-----110. 平衡二叉树
    leetcode-----109. 有序链表转换二叉搜索树
    leetcode-----108. 将有序数组转换为二叉搜索树
    leetcode-----107. 二叉树的层次遍历 II
    leetcode-----106. 从中序与后序遍历序列构造二叉树
    leetcode-----105. 从前序与中序遍历序列构造二叉树
    leetcode-----104. 二叉树的最大深度
    leetcode-----103. 二叉树的锯齿形层次遍历
  • 原文地址:https://www.cnblogs.com/fantasy3588/p/5391563.html
Copyright © 2020-2023  润新知