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

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

我是否需要检查或者它的行为是否像 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/

相关文章:

ios - 对象 block 复制

ios - 如何在ios中异步下载图片?

ios - 我有一个没有背景的 png 文件,如何在 iOS 中为该图像创建清晰的彩色背景?

c++ - Loki 仿函数 - 内存问题

c++ - 是否可以在运行时在堆上创建一个数组,然后在需要时分配更多空间?

objective-c - 创建一个自动释放池并在不同的上下文中耗尽它

objective-c - 复制 block (即 : copying them to instance variables) in Objective-C

ios - 如何让我的应用程序出现在事件 View 中?

ios - 释放什么

ios - iOS 10 特定日期重复本地通知