美文网首页
Block实现原理

Block实现原理

作者: 动感新势力fan | 来源:发表于2016-04-02 11:43 被阅读118次

摘要 引用自http://blog.itanbing.com/2015/07/20/block-retain-cycle-problem/

block是2010年WWDC苹果为Objective-C提供的一个新特性,它为我们开发提供了便利,比如GCD就大量使用了block,用来往执行队列中添加执行。那么block到底是什么东西呢。其实它就是一个闭包,一个引用自动变量的函数。很多语言也实现自己的闭包,比如C#的lamda表达式。这篇文章将从分析源码的角度来分析下block到底是什么鬼。

最简单的block,不持有变量

我们先新建一个源文件:block.c 代码如下

#include <stdio.h>int main(){ 
 void (^blk)(void) = ^(){printf("This is a block.");};
 blk();
 return 0;
}

我们使用clang(LLVM编译器,和GCC类似),通过命令clang -rewrite-objc block.c
,解析block.c这样我们就会得到对应的cpp文件block.cpp。去除一些影响我们阅读的代码。如下:

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) {
 printf("This is a block.");
}
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(){ 
 void (*blk)(void) = (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); 
 return 0;
}

相关文章

  • iOS-2 Block

    block块 系列文章: iOS Block浅浅析 - 简书 iOS Block实现原理 iOS Block __...

  • iOS Block存储域及循环引用

    系列文章:iOS Block概念、语法及基本使用iOS Block实现原理iOS Block __block说明符...

  • iOS Block 部分一

    主要讲解 Block 的底层实现原理; Block部分一Block部分二Block部分三Block知识点总结 基础...

  • Today面试

    Runloop 底层原理Kvo 底层原理ARC 底层原理 如何实现GCD 底层原理Block 底层原理Aut...

  • iOS Block概念、语法及基本使用

    系列文章:iOS Block实现原理iOS Block __block说明符 最近又翻了一遍《Objective-...

  • 深入研究Block用weakSelf、strongSelf、@w

    前言 在上篇中,仔细分析了一下Block的实现原理以及__block捕获外部变量的原理。然而实际使用Block过程...

  • iOS Block浅析

    Block实现原理 要想知道Block的内部实现,需要知道Block编译完后是什么样子,使用clang可看到Blo...

  • Block

    Block 1.Block的定义和语法2.Block的本质和分类3.__block的实现原理 Block的定义和语...

  • Block实现原理

    Block是带有自动变量值的匿名函数; 带有自动变量值在Block中表现为截获自动变量值; 自动变量值截获只能保存...

  • Block实现原理

    摘要 引用自http://blog.itanbing.com/2015/07/20/block-retain-cy...

网友评论

      本文标题:Block实现原理

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