博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
block 实现原理详解(一)
阅读量:5959 次
发布时间:2019-06-19

本文共 1478 字,大约阅读时间需要 4 分钟。

hot3.png

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

先来看这样一个问题,

int age = 10; void (^block)() = ^{ NSLog(@"%d",age); }; age = 30; block();//10

以及下面的这一段代码

__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函数中

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则是引用传递! 所以,才是如上的结果!

这是对block的一个基础认识,再接下来的一篇博客中,我讲介绍一下mrc和arc使用block的区别 希望能对读者有用!

转载于:https://my.oschina.net/panyong/blog/303520

你可能感兴趣的文章
计算机硬件及操作系统基础学习笔记
查看>>
Spring event 使用完全指南
查看>>
Android Studio3 "Error:Unable to tunnel through proxy. Proxy returns "HTTP/1.1 400 Bad Request""
查看>>
kubernetes redis pod CrashLoopBackOff修复心得
查看>>
Vlan的端口属性
查看>>
Beyond Compare 激活解决办法
查看>>
linux 低级文件编程(内核级别)
查看>>
【每天记一点】jquery设置radio选中遇到的问题
查看>>
main调用静态函数时候注意问题
查看>>
useradd
查看>>
PHP常量详解:define和const的区别
查看>>
centos下virtualbox里面xp 安装VBoxGuestAdditions
查看>>
vmware 新建的虚拟机安装vmtools 提升性能
查看>>
dstat简介
查看>>
libgdx游戏引擎开发笔记(四)文字显示BitmapFont
查看>>
libgdx游戏引擎开发笔记(八)SuperJumper游戏例子的讲解(篇二)---- 游戏界面跳转...
查看>>
资料集锦
查看>>
Jmeter查看QPS和响应时间随着时间的变化曲线
查看>>
phpstrom for mac 默认快捷键
查看>>
ES Java API_基于search template实现按品牌分页查询模板
查看>>