我是否需要检查或者它的行为是否像free()
它会忽略的那样nil
?
我找不到明确说明一种或另一种方式的文档。
我怀疑它是安全的。比如,这...
(lldb) p (void)_Block_release(0)
<no result>
......似乎没有崩溃。我想这就是这个意思?
我是否需要检查或者它的行为是否像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 中应该有唯一的参数被推送:在这种情况下是块地址。
它的内容存储在 r15 中,并在条件跳转之前进行比较。并且地址 0x7fff903535ca 在末尾,当它开始从堆栈中弹出时,所以是的,它是 nil 安全的:
0x7fff903535ca: addq $8, %rsp
0x7fff903535ce: popq %rbx
0x7fff903535cf: popq %r12
0x7fff903535d1: popq %r13
0x7fff903535d3: popq %r14
0x7fff903535d5: popq %r15
0x7fff903535d7: popq %rbp
0x7fff903535d8: ret
我认为它是安全的,例如 free() 等,但找不到任何引用作为证据。
您是否试图避免检查或代码中的混乱?如果是后者,我们可以添加一个宏来实现它,所以我们不在乎正确的答案是什么......
// Not sure if it's okay to Block_release nil
#define My_Block_release(b) ((b)? _Block_release(b) : 0)