在第三节 函数表示与搜索函数 提到block函数和普通的OC函数不同。
反汇编分析前需要理解block的实现原理,故推荐先看看这几篇文章及其所引用的参考资料:
Block介绍(一)基础
Block介绍(二)内存管理与其他特性
block介绍(三)揭开神秘面纱(上)
block介绍(四)揭开神秘面纱(下)
block函数的命名与上文提到类似。函数内部定义的block会以scope命名,如:
@implementation ViewController - (void)later { [self presentViewController:self animated:NO completion:^{ NSLog(@"wo yun"); [self didReceiveMemoryWarning]; }]; [UIView transitionFromView:self.view toView:self.view duration:1 options:UIViewAnimationOptionTransitionCurlUp completion:^(BOOL finished) { NSLog(@"%d", finished); }]; }在IDA中出现的名字分别为:
___23__ViewController_later__block_invoke ___23__ViewController_later__block_invoke6全局型block:
int (^nimei)(int, id) = ^(int p1, id p2) { p1++; [p2 release]; return 0; };显示为:
_nimei_block_invoke
由于block的实质是用一些结构体来保存调用信息,而结构体信息在release版的C++编译结果中是无明文的,所以在反汇编中block的传参看起来就是直接传到一块内存区域中,需要自己理解其排放顺序是参照那些结构体的。
以下是上面的源码- [ViewController later]函数的反汇编(Mac IDA):
__text:00001F30 ; =============== S U B R O U T I N E ======================================= __text:00001F30 __text:00001F30 ; ViewController - (void)later __text:00001F30 ; Attributes: bp-based frame __text:00001F30 __text:00001F30 ; void __cdecl -[ViewController later](struct ViewController *self, SEL) __text:00001F30 __ViewController_later_ proc near ; DATA XREF: __objc_const:00005590