block 实现原理详解(一)
来源:互联网 发布:企业网站排名怎么优化 编辑:程序博客网 时间:2024/05/22 10:39
http://my.oschina.net/panyong/blog/303520
对于大多数人来讲,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)(structmain_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的区别希望能对读者有用!
0 0
- block 实现原理详解(一)
- block实现原理详解
- block 实现原理详解
- block 实现原理(内存管理详解)
- block 实现原理(内存管理详解)(二)
- iOS Block底层实现原理详解
- block底层实现(一)
- block原理详细讲解(一)
- Block 原理详解
- Block 原理详解
- Block 原理详解
- block 实现原理和相关内存管理详解
- block 实现原理
- block底层实现原理
- Block的实现原理
- block的实现原理
- block的实现原理
- Block实现原理
- 【堆+模拟】[CodeForces-235E]printer
- 利用反射机制编写一个程序,这个程序能指定调用类的某个方法及构造方法,并把操作信息输出到控制台。
- php curl 302
- mysql数据表中文乱码解决办法
- 【51nod】 第K大区间2(二分+树状数组)
- block 实现原理详解(一)
- 老天待我不薄,又来这么一题POJ1753
- 网络黑客攻防学习平台之基础关第九题
- 法国INRIA Data Sets & Images 数据集和图像库
- 725 - Division
- XE7开发APK
- LeetCode 66. Plus One(加1)
- 如何踏上前端之路(干货高能预警)
- The BioID Face Database 人脸数据集