他们是一样的吗,copy和Block_copy()?多么?或者如果不是,有什么不同?
我对此好奇了一段时间,所以我决定做一些研究。
看看我找到了什么答案。
发布于 2014-06-20 12:38:52
最后,我找到了答案。copy Block_copy() 和是同一个,但并不完全一样。
这是我发现的:
让我们看一下块的类,其中有3个:
__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] (它的超类)的程序集:
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上的汇编代码:
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上的汇编代码:
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!!
在这一点上,我可以总结出copy 和 Block_copy() 是相同的!。
希望这能帮助和我有同样好奇心的人:
发布于 2014-06-20 17:33:18
在块指针类型的表达式上使用时,方法copy和函数Block_copy()是相同的。同样,方法release和函数Block_release()也是相同的。方法copy和release只是更多的Objective-C消息风格,因为块是Objective-C中的对象,并且像其他Cocoa对象一样使用retain和release管理内存。另一方面,在C/C++中使用块时,只能使用Block_copy()和Block_release()来管理块。
https://stackoverflow.com/questions/24320066
复制相似问题