美文网首页
iOS 之 block(4.2)

iOS 之 block(4.2)

作者: 老猫_2017 | 来源:发表于2020-01-13 18:37 被阅读0次

上一章节讨论了,block 本地变量,block 内部 变量,内部静态变量的问题, 以及参数传递的问题。
这接讨论主题:
全局变量的 block ,是什么样子的,静态block 是什么样的,以及他们对参数,又是如何处理的?

// source code
void (^myHello)(int) = ^(int x){
    int testHello = 4;
    int sHello = 2;
    int c = x;
};

int main(int argc, char * argv[]) {
    int a = 3;
    myHello(8);
}
// block impl
struct __block_impl {
  void *isa;
  int Flags;
  int Reserved;
  void *FuncPtr;
};

// block desc
static struct __myHello_block_desc_0 {
  size_t reserved;
  size_t Block_size;
} __myHello_block_desc_0_DATA = { 0, sizeof(struct __myHello_block_impl_0)};

// block 对应调用的函数
static void __myHello_block_func_0(struct __myHello_block_impl_0 *__cself, int x) {
  int testHello = 4;
  int sHello = 2;
  int c = x;
}

// my hello 对应的声明
struct __myHello_block_impl_0 {
  struct __block_impl impl;
  struct __myHello_block_desc_0* Desc;
  __myHello_block_impl_0(void *fp, struct __myHello_block_desc_0 *desc, int flags=0) {
    impl.isa = &_NSConcreteGlobalBlock;
    impl.Flags = flags;
    impl.FuncPtr = fp;
    Desc = desc;
  }
};
//  静态结构体中间变量
static __myHello_block_impl_0 __global_myHello_block_impl_0((void *)__myHello_block_func_0, &__myHello_block_desc_0_DATA);

// 初始化 变量myHello
void (*myHello)(int) = ((void (*)(int))&__global_myHello_block_impl_0);

// 调用   myHello(8);
    ((void (*)(__block_impl *, int))((__block_impl *)myHello)->FuncPtr)((__block_impl *)myHello, 8);

总结:

myhello 的声明,变化了,有独立的名称声明了,与所在的函数无关了,相比与stack block,基于所在函数名,构成声明。
isa 指向变化了,这个是指向 _NSConcreteGlobalBlock,
定义了 全局静态的结构体 __global_myHello_block_impl_0
初始化变量全局变量 myHello

// source code
int y = 10;
//static int y=10;

void (^myHello)(int) = ^(int x){
    int testHello = 4;
    int sHello = 2;
    int c = x;
    int z = y;
};

int main(int argc, char * argv[]) {
    int a = 3;
    myHello(8);
}
// block impl
struct __block_impl {
  void *isa;
  int Flags;
  int Reserved;
  void *FuncPtr;
};

// desc
static struct __myHello_block_desc_0 {
  size_t reserved;
  size_t Block_size;
} __myHello_block_desc_0_DATA = { 0, sizeof(struct __myHello_block_impl_0)};

// FuncPtr 指向函数
static void __myHello_block_func_0(struct __myHello_block_impl_0 *__cself, int x) {
  int testHello = 4;
  int sHello = 2;
  int c = x;
  int z = y;
}

// myHello block define
struct __myHello_block_impl_0 {
  struct __block_impl impl;
  struct __myHello_block_desc_0* Desc;
  __myHello_block_impl_0(void *fp, struct __myHello_block_desc_0 *desc, int flags=0) {
    impl.isa = &_NSConcreteGlobalBlock;
    impl.Flags = flags;
    impl.FuncPtr = fp;
    Desc = desc;
  }
};

//  myHello 对应的block 的赋值操作
static __myHello_block_impl_0 __global_myHello_block_impl_0((void *)__myHello_block_func_0, &__myHello_block_desc_0_DATA);
// 对变量  myHello 的赋值操作
void (*myHello)(int) = ((void (*)(int))&__global_myHello_block_impl_0);
// 调用   myHello(8);
    ((void (*)(__block_impl *, int))((__block_impl *)myHello)->FuncPtr)((__block_impl *)myHello, 8);

总结:

在引入全局变量的情况,并没有明显变化,全局变量,只是在函数中出现。
引入 static int y=10; 也仅仅是对应的变量值变化,其他的都不变化

相关文章

网友评论

      本文标题:iOS 之 block(4.2)

      本文链接:https://www.haomeiwen.com/subject/wernactx.html