首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >copy是否与Block_copy()相同?

copy是否与Block_copy()相同?
EN

Stack Overflow用户
提问于 2014-06-20 12:38:52
回答 2查看 289关注 0票数 3

他们是一样的吗,copyBlock_copy()?多么?或者如果不是,有什么不同?

我对此好奇了一段时间,所以我决定做一些研究。

看看我找到了什么答案。

EN

回答 2

Stack Overflow用户

发布于 2014-06-20 12:38:52

最后,我找到了答案。copy Block_copy() 和是同一个,但并不完全一样。

这是我发现的:

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

  1. __NSGlobalBlock__ -如果你实现一个块而不引用块的外部,你将得到一个此类的块。

};

  • __NSStackBlock__ (^ block )()= ^{ NSLog(@"GRAZZZZ");void-如果你实现一个块,并且块的外部有一个或多个引用,你将得到这个类的块(当你在非ARC环境中运行时,你会得到这个。在ARC环境中,ARC会自动为您复制它)。

//非ARC代码int block = 1234;};

  • __NSMallocBlock__ (^ theOutsider )()= ^{ NSLog(@"%d",theOutsider);void-如果复制__NSStackBlock__块,将获得此类块。

int theOutsider = 1234;void(^block1)() = ^{ NSLog(@"%d",theOutsider);}复制;//非弧形版本void(^block2 2)()= ^{ NSLog(@"%d",theOutsider);};//弧形版本

对于__NSGlobalBlock__,当你对它调用copy时,它什么也不做,只是返回。所以,忽略它吧。没有必要将任何内容移动到堆中。下面是-[__NSGlobalBlock copy] (它的超类)的程序集:

代码语言:javascript
复制
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时,它们会转发给它的超类-[NSBlock copy]copy方法。以下是它在OS X 10.9 SDK上的汇编代码:

代码语言:javascript
复制
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.1SDK上的汇编代码:

代码语言:javascript
复制
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中定义为:

代码语言:javascript
复制
#define Block_copy(...) ((__typeof(__VA_ARGS__))_Block_copy((const void *)(__VA_ARGS__)))

Block_copy()也会调用_Block_copy!!

在这一点上,我可以总结出copy Block_copy() 是相同的!

希望这能帮助和我有同样好奇心的人:

票数 5
EN

Stack Overflow用户

发布于 2014-06-20 17:33:18

在块指针类型的表达式上使用时,方法copy和函数Block_copy()是相同的。同样,方法release和函数Block_release()也是相同的。方法copyrelease只是更多的Objective-C消息风格,因为块是Objective-C中的对象,并且像其他Cocoa对象一样使用retainrelease管理内存。另一方面,在C/C++中使用块时,只能使用Block_copy()Block_release()来管理块。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24320066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档