在nil上调用Block_copy()和Block_release()是否安全?

时间:2013-01-04 00:35:44

标签: objective-c memory-management objective-c-blocks null

我是否需要检查或是否表现得像free()那样忽略nil

我无法找到明确表明这种或那种方式的文档。

怀疑是安全的。例如,这...

(lldb) p (void)_Block_release(0)
<no result>
似乎......没有崩溃。我认为这意味着什么?

2 个答案:

答案 0 :(得分:4)

我试过这个:

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在结束时,它开始从堆栈弹出,所以是的,它是零安全的:

0x7fff903535ca:  addq   $8, %rsp
0x7fff903535ce:  popq   %rbx
0x7fff903535cf:  popq   %r12
0x7fff903535d1:  popq   %r13
0x7fff903535d3:  popq   %r14
0x7fff903535d5:  popq   %r15
0x7fff903535d7:  popq   %rbp
0x7fff903535d8:  ret    

答案 1 :(得分:2)

我认为它是安全的,比如free()等,但找不到任何引用作为证据。

您是否试图避免检查或代码中的混乱?如果是后者,我们可以添加一个可以实现它的宏,所以我们不关心正确的答案是什么......

// Not sure if it's okay to Block_release nil
#define My_Block_release(b) ((b)? _Block_release(b) : 0)