iOS大解密:玄之又玄的KVO(1)

打印 上一主题 下一主题

主题 748|帖子 748|积分 2244

当我们给 num 赋值时,可以看到断点掷中了 KVO 类自定义的 setNum:的实现即_NSSetIntValueAndNotify 函数

那么_NSSetIntValueAndNotify 的内部实现是怎样的呢?我们可以从汇编代码中发现一些蛛丝马迹:
Foundation`_NSSetIntValueAndNotify:
0x10e5b0fc2 <+0>:   pushq  %rbp
->  0x10e5b0fc3 <+1>:   movq   %rsp, %rbp
0x10e5b0fc6 <+4>:   pushq  %r15
0x10e5b0fc8 <+6>:   pushq  %r14
0x10e5b0fca <+8>:   pushq  %r13
0x10e5b0fcc <+10>:  pushq  %r12
0x10e5b0fce <+12>:  pushq  %rbx
0x10e5b0fcf <+13>:  subq   $0x48, %rsp
0x10e5b0fd3 <+17>:  movl   %edx, -0x2c(%rbp)
0x10e5b0fd6 <+20>:  movq   %rsi, %r15
0x10e5b0fd9 <+23>:  movq   %rdi, %r13
0x10e5b0fdc <+26>:  callq  0x10e7cc882               ; symbol stub for: object_getClass
0x10e5b0fe1 <+31>:  movq   %rax, %rdi
0x10e5b0fe4 <+34>:  callq  0x10e7cc88e               ; symbol stub for: object_getIndexedIvars
0x10e5b0fe9 <+39>:  movq   %rax, %rbx
0x10e5b0fec <+42>:  leaq   0x20(%rbx), %r14
0x10e5b0ff0 <+46>:  movq   %r14, %rdi
0x10e5b0ff3 <+49>:  callq  0x10e7cca26               ; symbol stub for: pthread_mutex_lock
0x10e5b0ff8 <+54>:  movq   0x18(%rbx), %rdi
0x10e5b0ffc <+58>:  movq   %r15, %rsi
0x10e5b0fff <+61>:  callq  0x10e7cb472               ; symbol stub for: CFDictionaryGetValue
0x10e5b1004 <+66>:  movq   0x36329d(%rip), %rsi      ; “copyWithZone:”
0x10e5b100b <+73>:  xorl   %edx, %edx
0x10e5b100d <+75>:  movq   %rax, %rdi
0x10e5b1010 <+78>:  callq  *0x2b2862(%rip)           ; (void *)0x000000010eb89d80: objc_msgSend
0x10e5b1016 <+84>:  movq   %rax, %r12
0x10e5b1019 <+87>:  movq   %r14, %rdi
0x10e5b101c <+90>:  callq  0x10e7cca32               ; symbol stub for: pthread_mutex_unlock
0x10e5b1021 <+95>:  cmpb   $0x0, 0x60(%rbx)
0x10e5b1025 <+99>:  je     0x10e5b1066               ; <+164>
0x10e5b1027 <+101>: movq   0x36439a(%rip), %rsi      ; “willChangeValueForKey:”
0x10e5b102e <+108>: movq   0x2b2843(%rip), %r14      ; (void *)0x000000010eb89d80: objc_msgSend
0x10e5b1035 <+115>: movq   %r13, %rdi
0x10e5b1038 <+118>: movq   %r12, %rdx
0x10e5b103b <+121>: callq  *%r14
0x10e5b103e <+124>: movq   (%rbx), %rdi
0x10e5b1041 <+127>: movq   %r15, %rsi
0x10e5b1044 <+130>: callq  0x10e7cc2b2               ; symbol stub for: class_getMethodImplementation
0x10e5b1049 <+135>: movq   %r13, %rdi
0x10e5b104c <+138>: movq   %r15, %rsi
0x10e5b104f <+141>: movl   -0x2c(%rbp), %edx
0x10e5b1052 <+144>: callq  *%rax
0x10e5b1054 <+146>: movq   0x364385(%rip), %rsi      ; “didChangeValueForKey:”
0x10e5b105b <+153>: movq   %r13, %rdi
0x10e5b105e <+156>: movq   %r12, %rdx
0x10e5b1061 <+159>: callq  *%r14
0x10e5b1064 <+162>: jmp    0x10e5b10be               ; <+252>
0x10e5b1066 <+164>: movq   0x2b22eb(%rip), %rax      ; (void *)0x00000001120b9070: _NSConcreteStackBlock
0x10e5b106d <+171>: leaq   -0x68(%rbp), %r9
0x10e5b1071 <+175>: movq   %rax, (%r9)
0x10e5b1074 <+178>: movl   $0xc2000000, %eax         ; imm = 0xC2000000
0x10e5b1079 <+183>: movq   %rax, 0x8(%r9)
0x10e5b107d <+187>: leaq   0xf5d(%rip), %rax         ; ___NSSetIntValueAndNotify_block_invoke
0x10e5b1084 <+194>: movq   %rax, 0x10(%r9)
0x10e5b1088 <+198>: leaq   0x2b7929(%rip), %rax      ; __block_descriptor_tmp.77
0x10e5b108f <+205>: movq   %rax, 0x18(%r9)
0x10e5b1093 <+209>: movq   %rbx, 0x28(%r9)
0x10e5b1097 <+213>: movq   %r15, 0x30(%r9)
0x10e5b109b <+217>: movq   %r13, 0x20(%r9)
0x10e5b109f <+221>: movl   -0x2c(%rbp), %eax
0x10e5b10a2 <+224>: movl   %eax, 0x38(%r9)
0x10e5b10a6 <+228>: movq   0x364fab(%rip), %rsi      ; “_changeValueForKey

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

立聪堂德州十三局店

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表