Objective-C 块字面量语法原理
Objective-C Block Literal Syntax Principle
我是来自中国的iOS程序员,很抱歉我不能为这个问题做一个准确的标题,但我会尽量详细描述。如果有人可以帮我更改标题,我对此非常感谢。抱歉我的英语不好。
当我使用clang -rewrite-objc
查看有关块语法的源代码时,我发现有些地方我无法理解。这是我的代码:
int main(int argc, char *argv[]) {
void (^blk)() = ^ {
};
blk();
}
而核心源代码是
struct __block_impl {
void *isa;
int Flags;
int Reserved;
void *FuncPtr;
};
struct __main_block_impl_0 {
struct __block_impl impl;
struct __main_block_desc_0* Desc;
__main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, int flags=0) {
impl.isa = &_NSConcreteStackBlock;
impl.Flags = flags;
impl.FuncPtr = fp;
Desc = desc;
}
};
static void __main_block_func_0(struct __main_block_impl_0 *__cself) {
}
static struct __main_block_desc_0 {
size_t reserved;
size_t Block_size;
} __main_block_desc_0_DATA = { 0, sizeof(struct __main_block_impl_0)};
int main(int argc, char *argv[]) {
void (*blk)() = ((void (*)())&__main_block_impl_0((void *)__main_block_func_0, &__main_block_desc_0_DATA));
((void (*)(__block_impl *))((__block_impl *)blk)->FuncPtr)((__block_impl *)blk);
}
在主函数中,当我调用 blk() 时,源代码转换 blk 并通过此代码获取 FuncPtr
((__block_impl *)blk)->FuncPtr)
我不太明白,这是应该的吗?在我看来,我更喜欢使用
(((__main_block_impl_0 *)blk ->impl).FuncPtr)
我对C++不是很了解,如果有人能帮助我理解这段代码的原理,我将不胜感激。谢谢你们。
嗯,struct __main_block_impl_0
的第一个成员 (impl
) 是 struct __block_impl
。所以 struct __main_block_impl_0
的位置与其第一个成员 struct __block_impl
的位置相同。如果你有指向一个的指针,你可以把它当作指向另一个的指针。
我是来自中国的iOS程序员,很抱歉我不能为这个问题做一个准确的标题,但我会尽量详细描述。如果有人可以帮我更改标题,我对此非常感谢。抱歉我的英语不好。
当我使用clang -rewrite-objc
查看有关块语法的源代码时,我发现有些地方我无法理解。这是我的代码:
int main(int argc, char *argv[]) {
void (^blk)() = ^ {
};
blk();
}
而核心源代码是
struct __block_impl {
void *isa;
int Flags;
int Reserved;
void *FuncPtr;
};
struct __main_block_impl_0 {
struct __block_impl impl;
struct __main_block_desc_0* Desc;
__main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, int flags=0) {
impl.isa = &_NSConcreteStackBlock;
impl.Flags = flags;
impl.FuncPtr = fp;
Desc = desc;
}
};
static void __main_block_func_0(struct __main_block_impl_0 *__cself) {
}
static struct __main_block_desc_0 {
size_t reserved;
size_t Block_size;
} __main_block_desc_0_DATA = { 0, sizeof(struct __main_block_impl_0)};
int main(int argc, char *argv[]) {
void (*blk)() = ((void (*)())&__main_block_impl_0((void *)__main_block_func_0, &__main_block_desc_0_DATA));
((void (*)(__block_impl *))((__block_impl *)blk)->FuncPtr)((__block_impl *)blk);
}
在主函数中,当我调用 blk() 时,源代码转换 blk 并通过此代码获取 FuncPtr
((__block_impl *)blk)->FuncPtr)
我不太明白,这是应该的吗?在我看来,我更喜欢使用
(((__main_block_impl_0 *)blk ->impl).FuncPtr)
我对C++不是很了解,如果有人能帮助我理解这段代码的原理,我将不胜感激。谢谢你们。
嗯,struct __main_block_impl_0
的第一个成员 (impl
) 是 struct __block_impl
。所以 struct __main_block_impl_0
的位置与其第一个成员 struct __block_impl
的位置相同。如果你有指向一个的指针,你可以把它当作指向另一个的指针。