什么是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 不可以
网友评论