Block

96
诺颜110
2017.09.08 14:17* 字数 207
什么是blocks

用一句话概括: 带有自动变量(局部变量)的匿名函数

block 深入剖析

执行clang -rewrite-objc Rewrite Objective-C source to C++

struct __block_impl {
  void *isa;  /*指向所属类的指针,也就是block的类型*/
  int Flags; /*标志变量,在实现block的内部操作时会用到*/
  int Reserved; /*保留变量*/
  void *FuncPtr;/*block执行时调用的函数指针*/
};
/* Revised new layout. */
struct Block_descriptor {
    unsigned long int reserved;
    unsigned long int size;
    void (*copy)(void *dst, void *src);
    void (*dispose)(void *);
};


struct Block_layout {
    void *isa;
    int flags;
    int reserved; 
    void (*invoke)(void *, ...);
    struct Block_descriptor *descriptor;
    /* Imported variables. */
};

使用MRC管理内存时,Block的内存管理需要区分是Global(全局),Stack(栈)和Heap(堆),在使用了ARC之后,苹果自动会将所有原本应该放在栈中的Block全部放到堆中,

block 和 weak 修饰符的区别

  • __block不管是ARC 还是MRC 模式下都可以使用,可以修饰对象,也可以修饰基本数据类型
  • __weak只能在ARC模式下使用,只能修饰对象,不能修饰基本数据类型
    block修饰的值,可以在block中被修改,weak 不可以
参考链接

Block技巧与底层解析

程序员开发周记
Web note ad 1