上一章节讨论了,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; 也仅仅是对应的变量值变化,其他的都不变化
网友评论