您的位置:首页 > 移动开发 > IOS开发

iOS中Block实现的探究(一)

2015-03-13 17:40 211 查看
本文是学习jasonblog的《iOS中block实现的探究》一文的笔记,是在自己理解的基础上写的注释,不知是否有谬误之处,盼指正。

原文: http://blog.csdn.net/jasonblog/article/details/7756763?reload
下面是对于block中使用到局部变量、全局变量(或静态变量)这两种情况的理解。篇(二)中将会是对__block变量和其他方面的理解。

int globalInt = 0;

- (void)test {

int localInt = 3;
void (^blk)() = ^{
globalInt += localInt;
printf("globalInt + localInt = %d\n", globalInt);
};
blk();
}

// -------------------以下为上函数编译过程中的中间代码------------------- //

// block自身类
struct __block_impl {
void *isa; // block的类型,在堆上还是在栈上 &_NSConcreteStackBlock在栈上、&_NSConcreteGlobalBlock在堆上
int Flags;
int Reserved;
void *FuncPtr; // 指向block实现函数的指针(本例中指向函数static void __test_block_func_0(...))
};

// block--blk的类
// 类名根据所在函数(test函数)以及出现序列(第0个)进行命名。如果是全局block,就根据变量名和出现序列进行命名。
struct __test_block_impl_0 {
struct __block_impl impl;
struct __test_block_desc_0 *Desc; // 描述信息
int localInt; // 局部变量
int *globalInt; // 全局变量或静态变量会在这里有一个对应的指针
__test_block_impl_0(void *fp, struct __test_block_desc_0 *desc, int _localInt, int *_globalInt, int flags = 0): localInt(_localInt), globalInt(_globalInt) {
impl.isa = &_NSConcreteStackBlock;
impl.Flags = flags;
impl.FuncPtr = fp;
Desc = desc;
}
};

// block对应的函数体
static void __test_block_func_0(struct __test_block_impl_0 *__cself) { // block对应的函数体。__cself为block自身
int localInt = __cself -> localInt;
int *globalInt = __cself -> globalInt;
(*globalInt) += localInt;
printf("globalInt + localInt = %d\n", (*globalInt));
}

// 描述信息
static struct __test_block_desc_0 {
unsigned long reserved;
unsigned long Block_size;
} __test_block_desc_0__DATA = {0, sizeof(struct __test_block_impl_0)};

void test() {
int localInt = 3;
__test_block_impl_0 impl = __test_block_impl_0((void *)__test_block_func_0, &__test_block_desc_0__DATA, localInt, &globalInt);
void (*blk)(void) = (void (*)(void))&impl;
((void (*)(struct __block_impl *))((struct __block_impl *)blk) -> FuncPtr)((struct __block_impl *)blk);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: