Objective-C 块文字语法原则

Objective-C Block Literal Syntax Principle

本文关键字:原则 语法 文字 Objective-C      更新时间:2023-10-16

我是来自中国的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的位置相同。如果你有一个指针,你可以把它当作另一个的指针。