问IDA反汇编出来的block问题


#1

///block 的签名信息@“RACSignal”@?@“HTTPRequestContext”@?<@“RACSignal”@?>
_block(__int64 a1, __int64 a2, __int64 a3) {
v3 = a3;
v4 = objc_retain(a2, a2);
v5 = (*(__int64 (__fastcall **)(__int64))(v3 + 16))(v3); :grinning::grinning:就是这句
v6 = (void *)objc_retainAutoreleasedReturnValue(v5);
v22 = _NSConcreteStackBlock;
v23 = 3254779904LL;
v24 = +[CBLInjectionLauncher addErrorUploadInject]_block_block;
v25 = &unk_1009CDAC8;
v8 = objc_retain(v4, v7);
v9 = v8;
v26 = v8;
v10 = objc_msgSend(v6, “doNext:”, &v22);
v11 = (void *)objc_retainAutoreleasedReturnValue(v10);
v17 = _NSConcreteStackBlock;
v18 = 3254779904LL;
v19 = +[FHInjectionLauncher addErrorUploadInject]_block_block_0;
v20 = &unk_1009CDAF8;
v21 = v9;
v13 = objc_retain(v9, v12);
v14 = objc_msgSend(
v11,
“doError:”,
&v17,
_NSConcreteStackBlock,
3254779904LL,
+[FHInjectionLauncher addErrorUploadInject]_block_block_0,
&unk_1009CDAF8);
v15 = objc_retainAutoreleasedReturnValue(v14);
objc_release(v11);
objc_release(v21);
objc_release(v26);
objc_release(v13);
objc_release(v6);
return objc_autoreleaseReturnValue(v15);
}

求大佬解释下**_v5 = (*(__int64 (__fastcall **)(__int64))(v3 + 16))(v3);这句怎么理解啊
假如v3本身是个block的话 ,v3+16是什么啊


#2
00000000 Block_layout_10047E45C struc ;
00000000                                         ;
00000000 isa             DCQ ?                   ; offset
00000008 flags           DCD ?
0000000C reserved        DCD ?
00000010 invoke          DCQ ?                   ; offset
00000018 descriptor      DCQ ?                   ; offset
00000020 lvar1           DCQ ?
00000028 lvar2           DCQ ?
00000030 lvar3           DCQ ?
00000038 lvar*           DCQ ?
00000038 Block_layout_10047E45C ends

#3

看下这篇文章就解惑了


#4

我请人帮你转换了一下,具体什么含义,自己看截图就很清楚了。