gpt4 book ai didi

objective-c - copy 和 Block_copy() 一样吗?

转载 作者:搜寻专家 更新时间:2023-10-30 20:02:33 25 4
gpt4 key购买 nike

它们是否相同,copyBlock_copy()?如何?如果不是,有什么区别?

我对此很好奇,所以我决定做一些研究。

看看我发现了什么是我的答案。

最佳答案

我终于找到了答案。 copyBlock_copy() 相同,但不完全相同。

这是我发现的:


让我们看一下 block 的类别,其中有 3 个:

  1. __NSGlobalBlock__ - 如果您实现一个 block 而没有任何对 block 外部的引用,您将获得此类的一个 block 。

    void(^block)() = ^{ NSLog(@"GRAZZZZ"); };
  2. __NSStackBlock__ - 如果您实现一个 block ,其中包含一个或多个对 block 外部的引用,您将获得此类 block ,(当您运行仅限非 ARC 环境。在 ARC 环境中,ARC 会自动为您复制)。

    // NON-ARC CODE
    int theOutsider = 1234;
    void(^block)() = ^{ NSLog(@"%d", theOutsider); };
  3. __NSMallocBlock__ - 如果您复制一个 __NSStackBlock__ block ,您将获得此类的一个 block 。

    int theOutsider = 1234;
    void(^block1)() = [^{ NSLog(@"%d", theOutsider); } copy]; // NON-ARC VERSION
    void(^block2)() = ^{ NSLog(@"%d", theOutsider); }; // ARC VERSION

对于__NSGlobalBlock__,当你调用copy给它时,它什么都不做,只是返回。所以,无视它吧。无需将任何内容移动到堆中。下面是 -[__NSGlobalBlock copy](它的父类(super class))的程序集:

CoreFoundation`-[__NSGlobalBlock copy]:
0x7fff8bd016f0: pushq %rbp
0x7fff8bd016f1: movq %rsp, %rbp
0x7fff8bd016f4: movq %rdi, %rax
0x7fff8bd016f7: popq %rbp
0x7fff8bd016f8: ret
0x7fff8bd016f9: nopl (%rax)

对于__NSStackBlock____NSMallocBlock__,当你调用它们的copy时,它们转发给它的copy方法父类(super class),-[NSBlock copy]。这是它在 OS X 10.9 SDK 上的汇编代码:

CoreFoundation`-[NSBlock copy]:
0x7fff8bcc86a0: pushq %rbp
0x7fff8bcc86a1: movq %rsp, %rbp
0x7fff8bcc86a4: pushq %rbx
0x7fff8bcc86a5: pushq %rax
0x7fff8bcc86a6: movq %rdi, %rbx
0x7fff8bcc86a9: callq 0x7fff8be360ac ; symbol stub for: objc_collectingEnabled
0x7fff8bcc86ae: movq %rbx, %rdi
0x7fff8bcc86b1: addq $0x8, %rsp
0x7fff8bcc86b5: testb %al, %al
0x7fff8bcc86b7: je 0x7fff8bcc86c0 ; -[NSBlock copy] + 32
0x7fff8bcc86b9: popq %rbx
0x7fff8bcc86ba: popq %rbp
0x7fff8bcc86bb: jmpq 0x7fff8be361f6 ; symbol stub for: _Block_copy_collectable
0x7fff8bcc86c0: popq %rbx
0x7fff8bcc86c1: popq %rbp
0x7fff8bcc86c2: jmpq 0x7fff8be361f0 ; symbol stub for: _Block_copy
0x7fff8bcc86c7: nopw (%rax,%rax)

iOS 7.1 SDK上的汇编代码:

CoreFoundation`-[NSBlock copy]:
0x17949d0: pushl %ebp
0x17949d1: movl %esp, %ebp
0x17949d3: popl %ebp
0x17949d4: jmp 0x18d3d8a ; symbol stub for: _Block_copy
0x17949d9: nopl (%eax)

正如您在代码中看到的,-[NSBlock copy] 确实调用了 _Block_copy!。

copy 说完了,让我们来看看Block_copy()。它在 Block.h 中定义为:

#define Block_copy(...) ((__typeof(__VA_ARGS__))_Block_copy((const void *)(__VA_ARGS__)))

Block_copy() 也会调用 _Block_copy!!


至此,我可以总结一下,copyBlock_copy()是一样的!

希望这可以帮助和我有同样好奇心的人:D。

关于objective-c - copy 和 Block_copy() 一样吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24320066/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com