Block汇总

2021-06-15  本文已影响0人  冰山_X

1 Block的底层原理?

//用于描述块对象的>标志 flags
enum {
BLOCK_DEALLOCATING = (0x0001), // runtime
BLOCK_REFCOUNT_MASK = (0xfffe), // runtime
BLOCK_NEEDS_FREE = (1 << 24), // runtime
BLOCK_HAS_COPY_DISPOSE = (1 << 25), // compiler
BLOCK_HAS_CTOR = (1 << 26), // compiler: helpers have C++ code
BLOCK_IS_GC = (1 << 27), // runtime
BLOCK_IS_GLOBAL = (1 << 28), // compiler
BLOCK_USE_STRET = (1 << 29), // compiler: undefined if !BLOCK_HAS_SIGNATURE
BLOCK_HAS_SIGNATURE = (1 << 30), // compiler
BLOCK_HAS_EXTENDED_LAYOUT=(1 << 31) // compiler
};

//block的底层结构
struct Block_layout {
void *isa; //isa指针,8字节
volatile int32_t flags; //上面的枚举
int32_t reserved;
BlockInvokeFunction invoke;//调用函数
struct Block_descriptor_1 *descriptor;
//descriptor:此变量为可变,根据flags来确定是否有
//Block_descriptor_2和Block_descriptor_3,
//通过内存偏移获取!
};

block本质上是一个结构体,内部含有isa指针,也为一个oc对象

block分为3种类型

  1. 使用全局变量的时候
  2. 不截获外部变量的时候
  1. 调用block的copy方法的时候
  2. block作为函数返回值返回的时候
  3. 将block赋值给附有_strong修饰符id类型的类或者block类型成员变量时候
  4. 方法中含有usingBlock的Cocoa框架方法或者GCD的API中传递block时候


    image.png

2 循环引用是什么?怎么检测循环引用?怎么解决?怎么出现?

原理:

循环引用指两个(多个)对象之间互相强引用,从而导致这些对象的引用计数始终大于0,无法释放,最后导致内存泄露的现象

检测:

解决:

delegate跟block,都是用weak修饰即可打破循环
timer循环,在退出页面的时候,手动销毁timer对象即可

复现:

3 weak,strong,assign,copy的异同?

weak

assign

strong

copy

上一篇下一篇

猜你喜欢

热点阅读