我是否需要检查或者它的行为是否像 free()
那样它会忽略 nil
?
我无法找到明确说明一种或另一种方式的文档。
我的怀疑是它是安全的。例如,这个...
(lldb) p (void)_Block_release(0)
<no result>
...似乎没有崩溃。我认为这就是那个意思?
最佳答案
我试过这个:
Block_copy(-1);
这显然导致了崩溃,所以我进入了汇编代码:
0x7fff9035342a: movq %rdi, %r15
0x7fff9035342d: xorl %eax, %eax
0x7fff9035342f: testq %r15, %r15
0x7fff90353432: je 0x7fff903535ca ; _Block_copy_internal + 430
在 rdi 中应该有唯一的参数被推送:在这种情况下是 block 地址。
它的内容存储在 r15 中,并在条件跳转之前进行比较。地址 0x7fff903535ca 在末尾,当它开始从堆栈中弹出时,所以是的,它是零安全的:
0x7fff903535ca: addq $8, %rsp
0x7fff903535ce: popq %rbx
0x7fff903535cf: popq %r12
0x7fff903535d1: popq %r13
0x7fff903535d3: popq %r14
0x7fff903535d5: popq %r15
0x7fff903535d7: popq %rbp
0x7fff903535d8: ret
关于objective-c - 在 nil 上调用 Block_copy() 和 Block_release() 是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14149510/