Block相关

OC代码:

 1 int main(int argc, const char * argv[]) {
 2
 3     void (^blk)(void) = ^{
 4         printf("Block\n");
 5     };
 6
 7     blk();
 8
 9     return 0;
10 }

通过Clang -rewrite-objc命令转成C语言代码:

 1 struct __block_impl {
 2   void *isa;
 3   int Flags;
 4   int Reserved;
 5   void *FuncPtr;
 6 };
 7
 8 struct __main_block_impl_0 {
 9     struct __block_impl impl;
10     struct __main_block_desc_0* Desc;
11     __main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, int flags=0) {
12         impl.isa = &_NSConcreteStackBlock;
13         impl.Flags = flags;
14         impl.FuncPtr = fp;
15         Desc = desc;
16     }
17 };
18
19 static void __main_block_func_0(struct __main_block_impl_0 *__cself) {
20     printf("Block\n");
21 }
22
23 static struct __main_block_desc_0 {
24     size_t reserved;
25     size_t Block_size;
26 } __main_block_desc_0_DATA = { 0, sizeof(struct __main_block_impl_0)};
27
28 int main(int argc, const char * argv[]) {
29
30     void (*blk)(void) = ((void (*)())&__main_block_impl_0((void *)__main_block_func_0, &__main_block_desc_0_DATA));
31
32     ((void (*)(__block_impl *))((__block_impl *)blk)->FuncPtr)((__block_impl *)blk);
33
34     return 0;
35 }

可以看到整个Block结构如下:

时间: 2024-10-05 11:43:21

Block相关的相关文章

block相关归纳

经过今天的Block的学习.上网查询相关文章归纳了一下 一.一个使用Block的好处有: Block可以用在许多不同的环境中,这样可以让代码更加简单,以及减少函数声明的数量,不用实现代理协议. 简单性:使用 Block 我们可以不写任何附加的代码就可以访问对象,对象在数组中的索引,stop 变量. 这意味着少量的代码,减少了发生编码错误的机会(当然,并非我们一定会出现编码错误). 速度:使用 Block 在执行速度上要比使用快速枚举快. 在我们这个例子中,这点微小的速度提升不值得一提,但是在更复

Linux Centos的Inode及Block相关知识

本经验均在CentOSrelease6.7(Final)下操作,如知识有欠缺之处 欢迎批评指正. linux 的inode及block的相关知识: 1>  Linux系统分区格式化文件系统之后,系统会分为Inode及Block两部分: 1)Inode为系统文件的属性信息(ls -l的结果)及指向文件实体的指针,但是没有存放文件名,一般在上级目录里的Block. 2)Block为存放数据的,ext3/ext4一般为1k,2k,4k,一般默认4k 3)一个文件不论多大至少占用一个Inode和一个Bl

block相关知识点

Block简介1.Block类似于函数,指向一块代码的指针(类似C中的回调函数)Block经常用来代替delegate2.跟函数的写法基本是一致的  声明 + 实现 + 调用    2.1声明:^ 脱字符                    返回类型(^Block的名字)(类型1 参数1,类型2 参数2……):    2.2 实现:Block的名字 = ^(类型1 参数1……){  }   2.3 调用:如果不调用,那么代码块中的内容是不会执行的,什么时候调用,就什么时候执行         

OC高级编程——深入block,如何捕获变量,如何存储在堆上

首先先看几道block相关的题目 这是一篇比较长的博文,前部分是block的测试题目,中间是block的语法.特性,block讲解block内部实现和block存储位置,请读者耐心阅读.具备block基础的同学,直接调转到block的实现 下面列出了五道题,看看能否答对两三个.主要涉及block栈上.还是堆上.怎么捕获变量.答案在博文最后一行 //-----------第一道题:-------------- void exampleA() { char a = 'A'; ^{ printf("%

格而知之15:我所理解的Block(1)

1.Block 本质上是一个struct结构体,在这个结构体中,最重要的成员是一个函数(当然除函数外还有其他重要的成员). 2.在开始解析Block之前,首先来回顾一下Block的格式.Block相关的格式有2个: (1).Block对象的格式: (2).Block变量的格式: 3.对于Block对象,它有几种常见的格式: (1).一个完整的Block对象的格式如下: 比如这个Block对象: 可以发现,完整的Block对象和函数的定义非常相似,比如这个函数: 两者之间的区别仅仅是:Block对

让我们来深入浅出block吧

http://www.jianshu.com/p/e03292674e60 开始之前,我想先提几个问题,看看大家是否对此有疑惑.唐巧已经写过一篇对block很有研究的文章,大家可以去看看(本文会部分引用巧哥文中出现的图和代码).在巧哥的基础上,我补充一些block相关的知识点和代码,并且概括并修正一些观点. 1.block是什么?block是对象吗? 2.block分为哪几种?__blcok关键字的作用? 3.block在ARC和MRC下的区别? 4.block的生命周期? 5.block对于以

iOS中block实现的探究

[0. Brief introduction of block] Block是iOS4.0+ 和Mac OS X 10.6+ 引进的对C语言的扩展,用来实现匿名函数的特性. 用维基百科的话来说,Block是Apple Inc.为C.C++以及Objective-C加入的特性,使得这些语言能够用类lambda表达式的语法来创建闭包. 用Apple文档的话来说,A block is an anonymous inline collection of code, and sometimes also

(译)IOS block编程指南 1 介绍

Introduction(介绍) Block objects are a C-level syntactic and runtime feature. They are similar to standard C functions, but in addition to executable code they may also contain variable bindings to automatic (stack) or managed (heap) memory. A block ca

Oracle RAC 全局等待事件 gc current block busy 和 gc cr multi block request 说明--转载(http://blog.csdn.net/tianlesoftware/article/details/7777511)

一.RAC 全局等待事件说明 在RAC环境中,和全局调整缓存相关的最常见的等待事件是global cache cr request,global cache busy和equeue. 当一个进程访问需要一个或者多个块时,Oracle会首先检查自己的Cache是否存在该块,如果发现没有,就会先通过global cache赋予这些块共享访问的权限,然后再访问.假如,通过global cache发现这些块已经在另一个实例的Cache里面,那么这些块就会通过Cache Fusion,在节点之间直接传递,