iOS block
2016-04-14 16:19
603 查看
对于大多数人来讲,block内部到底是怎样实现的呢?我们可以借助clang将其编译成为c++的代码,就可以看出,block到底是什么东西,
先来看这样一个问题,
以及下面的这一段代码
你会发现这两个结果是不同的,
第一个输出10,第二个输出的是30
要想知道这里面干了些什么!需要我们将其编译成为C++代码,看下里面到底搞了些什么?
使用终端,转到mian.m文件下,使用如下代码 clang -rewrite-objc main.m 将其编译生成 main.cpp文件
这时候,我们打开mian.cpp便知 在文件的最底下main函数中
{
}
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则是引用传递!
所以,才是如上的结果!
先来看这样一个问题,
<!-- 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则是引用传递!
所以,才是如上的结果!
相关文章推荐
- iOS - 项目加密处理
- iOS CADisplayLink 使用WSYFPSLabel监测程序FPS
- 谈谈入门iOS的经验吧
- iOS开发 GET、POST请求方法(NSURLSession篇)
- ios 内置支付宝
- iOS 通知 代理 block
- iOS 记录之 CocoaPods Pods的制作(新版方式)
- 申请iOS开发者账号遇到的一些坑
- iOS:键盘弹出和收起的通知使用
- iOS开发中有关图片裁切的问题
- ios 定时器不同的工作模式
- ios 保留子线程不退出可以继续执行任务
- iOS开发--调试必备 — NSLog
- iOS开发--计时器-NSTimer与CADisplayLink
- Xcode编译错误_Offsetof
- iOS原生的AVFoundation扫描二维码/条形码
- 漫谈iOS RSA非对称加密与解密
- ArcGIS Runtime SDK for iOS(二) ---使用定时器绘制由point组成的polyLine,并显示位置坐标
- iOS 获取系统当前时间
- ios socket简单使用