作者: 纳兰沫 | 来源:发表于2019-01-11 15:47 被阅读2次

非作者原著 来自摘抄

参考文献

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)()是什么

相关文章

  • 栈块 堆块 全局块

    编译器会给if 和 else 两个范围内的block 分配栈内存, 但是只要出了这个范围之后, 栈内存有可能被覆写...

  • 栈块、堆块、全局块

    编译器版本为Clang5,主要技术是ARC,参考来自Objective-C Automatic Reference...

  • 全局块、栈块及堆块

    栈块 void (^block)(); if(){ block = ^(){ NSLog(@"block a"...

  • 5块,or 50块

    读书的时候,学校后门5块钱就能吃一顿很丰盛的午餐,可以包含两荤两素,大排,鱼,红烧肉都在内了,一个盒子装...

  • 配置块/运行块

    配置块 AngularJS模块可以在被加载之前对其自身进行配置。我们可以在应用的加载阶段配置不同的逻辑。 通过co...

  • 不要在块内声明一个函数,如果确实需要,用函数表达式

  • 非作者原著 来自摘抄 参考文献 J_Knight_Little_Mango 分为3类块 栈块 堆块 全局块 blo...

  • 块字,是简化字字形,繁体是塊。《说文》塊:“墣也。从土,一屈象形。塊,凷或从鬼。苦對切”。塊,其实是凷字的俗字。古...

  • block 全局块 栈块及堆块

    栈区(block) 定义块的时候,其所占的内存区域是分配在栈中的.块只在定义它的那个范围内有效.例如,下面这段代码...

  • 包含块、块级元素、块元素等等

    包含块 一个元素,它的框的尺寸和位置会相对于一个特定的矩形框边缘来计算而得到,这个特定的矩形框称之为该元素的包含块...

网友评论

      本文标题:

      本文链接:https://www.haomeiwen.com/subject/ipsxdqtx.html