Block原理

  • Block原理
  • Block自动截获局部变量

Block原理

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {

    void (^blk)(void) = ^{
        printf("Block\n");
    };

    blk();

    return 0;
}
clang -rewrite-objc main.m  //执行命令生成main.cpp

主要代码摘要如下:

// __block_impl
struct __block_impl {
  void *isa;
  int Flags;    // 标记
  int Reserved; // 今后版本升级所需要的区域
  void *FuncPtr;// 要调用的函数指针
};
// __main_block_impl_0即Block的结构体
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; // _NSConcreteStackBlock相当于class_t结构体实例,联想OC对象中的isa指针的功能保持该对象对应的类的结构体,由此可见Block其实就是OC对象
    impl.Flags = flags;
    impl.FuncPtr = fp;
    Desc = desc;
  }
};
// __main_block_func_0
static void __main_block_func_0(struct __main_block_impl_0 *__cself) {

        printf("Block\n");
    }
// __main_block_desc_0
static struct __main_block_desc_0 {
  size_t reserved;  // 今后升级所需要的区域
  size_t Block_size;// block的大小
} __main_block_desc_0_DATA = { 0, sizeof(struct __main_block_impl_0)};

int main(int argc, const char * argv[]) {
    /* 构造函数调用,去掉转换部分等价于   struct __main_block_impl_0 *tmp = __main_block_impl_0(__main_block_func_0,&__main_block_desc_0_DATA);   struct __main_block_impl_0 *blk = tmp; 栈上生成的结构体实例的指针tmp,赋值给结构体指针类型的变量blk
    */
    void (*blk)(void) = ((void (*)())&__main_block_impl_0((void *)__main_block_func_0, &__main_block_desc_0_DATA));
    /*     去掉转换部分等价于    (*blk->impl.FunPtr)(blk); 使用函数指针调用函数   */
    ((void (*)(__block_impl *))((__block_impl *)blk)->FuncPtr)((__block_impl *)blk);

    return 0;
}

源码下载

Block自动截获局部变量

(未完待续...)

时间: 2024-12-29 01:11:20

Block原理的相关文章

iOS Block原理简析

Block的语法 Block是iOS闭包的实现方式,能够获取局部变量的匿名函数. Block的OC声明 返回值类型 (^Block变量名字)(参数列表) = (参数列表){}; 例子 int (^add)(int a,int b) = ^(int a, int b) { return a + b; }; int sum = add(1,4); NSLog(@"sum = %d",sum); NSString* (^getFullName)(NSString *first,NSStrin

转:Block原理及引用循环问题

2010年WWDC发布iOS4时Apple对Objective-C进行了一次重要的升级:支持Block.说到底这东西就是闭包,其他高级语音例如Java和C++已有支持,第一次使用Block感觉满简单好用的,但是慢慢也遇到很多坑.本文聊聊ARC和non-ARC下Block使用中的引用循环问题,最近遇到了好几次这种问题,还是深入记录下.先来套题目热热身,貌似能够全部答对的人蛮少的 Block实现原理 首先探究下Block的实现原理,由于Objective-C是C语言的超集,既然OC中的NSObjec

探索 Block (一) (Block 实现原理)

前言 要探索Block前先说一下我对Block的理解,我把它理解为:能够捕获它所在函数内部的变量的函数指针.匿名函数或者闭包.注意红色部份说的是它的精髓所在.希望看我这篇文章的人能够跟我说的步骤去做,做起来也比较简单,这样会有更好的效果,当然如果只看文章就能够让读者明白,那是我更加希望的. 一.首先,我们准备一个.m文件.我这里是main.m.内容如下: int main(int argc, char * argv[]) { void (^test)() = ^(){ }; test(); }

block注意事项

1.block的声明和注意事项 #import "ZYViewController.h" @interface ZYViewController () @end /*用typedef可以声明一种类型的block*/ //block前加上typedef, 那么就不是一个block指针(变量),而是一种block类型 //给int (^) (int a, int b) 这种block类型 声明了一个别名,叫做Block5 typedef int (^Block5) (int a, int

iOS开发-语法篇-block详解

一:基本定义 /*初步上式block定义的一些理解和解释,接下来会详解: *block名为myBlock,结合C的函数指针,myBlock为block体的指针,指向block体的入口地址 *int result = myBlock(5) <==> ^(int num){return num*num}(5)//将5传给num *回调时可以将myBlock作为参数传入,也可以直接传入block体^(int num){…};// *整个block体作为参数传入时,往往没有参数,只是进行延迟运算作用,

IOS之block,一点小心得

作为一个iOS开发程序员,没用过block是不可能的.这次我探讨的是block原理,但是有些更深层次的东西,我也不是很清楚,以后随着更加了解block将会慢慢完善. 第一个问题,什么是block? 我们都会用block,但是block是什么呢,这是首先要弄清楚的概念.虽然,是什么并不影响我们用它,但是搞清楚原理我们才能更好的去使用它,我觉得作为一个程序员,需要时刻保持对事物原理追究的心态? block的是本质是对象.但是你也可以说它是代码块.闭包.内联函数.函数指针...还有很多叫法,也可能这里

ARC下需要注意的内存问题

之前发了一篇关于图片加载优化的文章,还是引起很多人关注的,不过也有好多人反馈看不太懂,这次谈谈iOS中ARC的一些使用注意事项,相信做iOS开发的不会对ARC陌生啦.这里不是谈ARC的使用,只是介绍下ARC下仍然可能发生的内存泄露问题,可能不全,欢迎大家补充. Ps:关于ARC的使用以及内存管理问题,强烈建议看看官方文档,里面对内存管理的原理有很详细的介绍,相信用过MRC的一定看过这个. 另也有简单实用的ARC使用教程:ARC Best Practices 在2011年的WWDC中,苹果提到90

ARC下需要注意的内存管理

ARC下需要注意的内存管理 2016/04/03 · iOS开发 · 内存管理 分享到:1 原文出处: 一不(@luoyibu) 之前发了一篇关于图片加载优化的文章,还是引起很多人关注的,不过也有好多人反馈看不太懂,这次谈谈iOS中ARC的一些使用注意事项,相信做iOS开发的不会对ARC陌生啦.这里不是谈ARC的使用,只是介绍下ARC下仍然可能发生的内存泄露问题,可能不全,欢迎大家补充. Ps:关于ARC的使用以及内存管理问题,强烈建议看看官方文档,里面对内存管理的原理有很详细的介绍,相信用过M

img 图片底部会有白色区域

原因: 标签是分成 区块 和 内联块 2种 一个标签显示一行的称为 区块,如(段落P,标题H系列,DIV等) 若标签能在一行显示N个,表明此标签为 内联块,如(<a>,<img>,<input>) 区块和内联块最大的区别就是,区块可以设置宽.高.居中对齐等操作,而内联块不行 img 标签 是inline 元素, inline元素默认是baseline对齐的.当baseline对齐的时候 下方会有4px 的空隙. 解决方法: 方法一:display: block; 原理: