"You can specify that an imported variable be mutable—that is, read-write— by applying the __block storage type modifier."文档已经清楚说明了它的作用。反汇编就是要看个究竟。

__block类型有着它自己的storage,是blocks编程的一部分,今天先来看一下它如何做storage的。

我们定义如下:

NSString* c = [@"ab" stringByAppendingString:@"c"];
__block NSInteger bi = ;
__block NSString* bc = c;

得到反汇编代码:

0x10699054a <+>:  movq   0x14bf7(%rip), %rsi       ; "stringByAppendingString:"
0x106990551 <+>: leaq 0x13da8(%rip), %rdi ; @"ab"
0x106990558 <+>: leaq 0x13dc1(%rip), %rdx ; @"'c'"
0x10699055f <+>: movq -0xf0(%rbp), %rcx
0x106990566 <+>: movq %rax, -0xf8(%rbp)
0x10699056d <+>: callq *%rcx
0x10699056f <+>: movq %rax, -0x28(%rbp)
-> 0x106990573 <+>: movq $0x0, -0x48(%rbp)
0x10699057b <+>: leaq -0x48(%rbp), %rax
0x10699057f <+>: movq %rax, -0x40(%rbp)
0x106990583 <+>: movl $0x20000000, -0x38(%rbp)
0x10699058a <+>: movl $0x20, -0x34(%rbp)
0x106990591 <+>: movq $0x0, -0x30(%rbp)
0x106990599 <+>: movq $0x0, -0x78(%rbp)
0x1069905a1 <+>: leaq -0x78(%rbp), %rax
0x1069905a5 <+>: movq %rax, -0x70(%rbp)
0x1069905a9 <+>: movl $0x52000000, -0x68(%rbp)
0x1069905b0 <+>: movl $0x30, -0x64(%rbp)
0x1069905b7 <+>: leaq -0x21e(%rip), %rax ; __Block_byref_object_copy_ at ViewController.mm:74
0x1069905be <+>: movq %rax, -0x60(%rbp)
0x1069905c2 <+>: leaq -0x1e9(%rip), %rax ; __Block_byref_object_dispose_ at ViewController.mm:74
0x1069905c9 <+>: movq %rax, -0x58(%rbp)
0x1069905cd <+>: movq -0x28(%rbp), %rax
0x1069905d1 <+>: movq %rax, -0x50(%rbp)

很容易就看到两处构造对像的地方,没有错就是__block NSInteger bi和__block NSString* bc。这样就可以写出反c++伪代码:

__Block_byref_object_copy_的汇编简单不贴了,_Block_object_assign就是根据最后一个标志参数选择执行_Block_retain,_Block_assign。此方法是被Block定义(就是NSBlock的一种),在构造私有调用栈时调用的。
另一个__Block_byref_object_dispose_就是__block在析构里调用的。
__block storage的地址被压入NSBlock的私有调用栈,地址不能改变,但是__block storage不在私有栈中,所以被它包装起来的真正的变量可以被修改。
例如NSString*, int在NSBlock的私有调用栈中分别是NSString* const, int count, 而__block NSString*, __block int则是__block<NSString*>* const, __block<int>* const。 上一篇介绍了《逆向分析objc,所有类的信息都能在动态调试中获取》。 最后,多谢大家观看本篇文章。下一篇将分析block的反汇编,还会看到__block变量是如何被block使用的。 更正修改:20150116
    :伪代码中少了一个成员,这个成员作用是__block变量从stack-based中脱离后,真实的指向(,或叫做重定向)。

最新文章

  1. [LeetCode] Repeated Substring Pattern 重复子字符串模式
  2. Java_解密ThreadLocal
  3. HMI开发与控件
  4. LoadRunner在移动端性能测试的应用
  5. JS判断一个数组中是否有重复值的三种方法
  6. Android textView 动态设置代码字号大小,支持单位选项 dp,sp or px
  7. 找工作笔试面试那些事儿(10)---SQL语句总结
  8. OCM读书笔记(2) - PL/SQL 基础
  9. Servlet Filter 过滤器
  10. POJ 1696 Space Ant
  11. Swift 2.2 的新特性
  12. SQL MID() 函数
  13. TYVJ1424-占卜DIY
  14. [angularjs] 前端路由实现单页跳转
  15. C-Linux_定时器示例使用
  16. 使用NewLife网络库构建可靠的自动售货机Socket服务端(一)
  17. git .gitignore 文件不起作用
  18. echarts 数据统计报表
  19. 使用 java 实现一个简单的 markdown 语法解析器
  20. IOC轻量级框架之Unity

热门文章

  1. Spring Cloud Alibaba (nacos 注册中心搭建)
  2. Rancher与ARM深化战略合作,“软硬结合”加速边缘计算时代
  3. day07整理(内置方法\循环判断)
  4. [随机化算法] 听天由命?浅谈Simulate Anneal模拟退火算法
  5. Git的安装及布置
  6. C#关于private protected sealed Virtual/Override
  7. django-模板之模板变量(二)
  8. PHP 输出XML字符串
  9. CTR@因子分解机(FM)
  10. win10+MinGw+ffmpeg 编译