转自:http://blog.ibireme.com/2013/11/27/objc-block/
关于block的语法,请使劲戳这里→fuckingblocksyntax.com
这篇文章只记录一下block的实现,和block使用的注意事项。
正文:
1.block的数据结构
首先,关于block的数据结构和runtime是开源的,可以在llvm项目看到,或者下载苹果的libclosure库的源码来看。苹果也提供了在线的代码查看方式,其中包含了很多示例和文档说明。
这两个地方的定义是相同的:
struct Block_descriptor_1 {
uintptr_t reserved;
uintptr_t size;
};
struct Block_layout {
void *isa;
volatile int32_t flags; // contains ref count
int32_t reserved;
void (*invoke)(void *, ...);
struct Block_descriptor_1 *descriptor;
// imported variables
};
在objc中,根据对象的定义,凡是首地址是*isa的结构体指针,都可以认为是对象(id)。这样在objc中,block实际上就算是对象。
为了查看编译器具体的工作,这里可以用clang重写一段代码试试看: