非作者原著 来自摘抄

参考文献

J_Knight_
Little_Mango

分为3类块

  • 栈块
  • 堆块
  • 全局块

block根据分配的内存位置分为栈块 堆块 全局块

1.如果一个block中引用了全局变量 或者么有引用任何外部变量 (属性 实例变量 局部变量) 那么该block为全局块
2.其它引用情况(局部变量 实例变量 属性)为栈块
3.前提是在block创建的时候 在赋值给变量之后 在mrc下依然是栈块 而在arc下就变成了堆块

栈块

定义块的时候 其所占内存区域是分配在栈中的 而且只在定义它的那个范围内有效

void (^block)();
if ( /* some condition */ ) {
    block = ^{
     NSLog(@"Block A");
    };

} else {
    block = ^{
     NSLog(@"Block B");
    };
}
block();

堆块

全局块

全局块声明在全局内存里 不需要再每次用到的时候于栈中创建

void (^block)() = ^{
     NSLog(@"This is a block");
};

不管是对block进行retain copy release block的引用计数都不会增加 始终为1

总结

在创建block的时候(MRC和ARC通用)

1.如果在一个block中引用了全局变量 或者没有引用任何外部变量(局部变量 属性 实例变量)那么block就是全局块
2.其他引用情况(局部变量 属性 实例变量)为栈块

在将block对象赋值给其他对象^(oBlock)()的时候(ARC)

1.如果block是栈块 那么^(oBlock)()就变成堆块(因为Clang编译器帮我们往block发送了copy消息)
2.如果block是全局块 那么^(oBlock)()也是全局块 如果block是堆块 那么^(oBlock)()也是堆块
3.如果仅把创建完的block当做方法参数使用(不进行其他赋值引用) 那么block的类型不变

在将block对象赋值给其他对象^(oBlock)()的时候(MRC)

1.block是什么 ^(oBlock)()是什么

猜你喜欢

转载自blog.csdn.net/weixin_33842304/article/details/87165722
今日推荐