美文网首页将来跳槽用
栈块 堆块 全局块

栈块 堆块 全局块

作者: foolish_hungry | 来源:发表于2018-06-20 21:18 被阅读0次
void (^block) (void);
    BOOL flag = YES;
    if (flag) {
        block = ^{
            NSLog(@"Block A");
        };
    } else {
        block = ^{
            NSLog(@"Block B");
        };
    }

    block();

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

解决办法: 给块对象发送copy消息, 将块对象从栈上拷贝到堆上, 之后块对象就是采用引用计数来进行内存管理了, 块对象的内存不会在范围之外被覆写, 也就不会有崩溃的可能了.

修改后的代码

    void (^block) (void);
    BOOL flag = YES;
    if (flag) {
        block = [ ^{
            NSLog(@"Block A");
        } copy];
    } else {
        block = [ ^{
            NSLog(@"Block B");
        } copy];
    }

    block();

全局块

@interface ViewController ()

@end

// 全局块
void (^globalBlock) (void) = ^{
    NSLog(@"hello");
};

@implementation ViewController

这种块不需要捕获任何状态, 块的内存区域在编译的时候, 就确定好了, 全局块的拷贝是个空操作, 因为全局快不可能被系统回收, 可以将它看作为单例.

参考 (编写高质量iOS 与 OX 52 个有效方法)

相关文章

  • 栈块 堆块 全局块

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

  • 栈块、堆块、全局块

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

  • 全局块、栈块及堆块

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

  • iOS block的类型

    block:栈块、堆块、全局块。 1.栈块 NSGlobalBlock 表示这个block是全局分配的。block...

  • block 全局块 栈块及堆块

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

  • 简单理解block的种类

    块(Block)分为三类: 栈块 堆块 全局块 1. 栈block 定义块的时候,其所占内存区域是分配在栈中的,而...

  • 2019-02-08

    栈块、堆块、全局块 (Block详解) 对于Block之前只是在用,对于栈,堆这块没有细入研究,今天抽空把”Eff...

  • 2018-04-19

    第六章:块与大中枢派发 37. 理解块的概念 全局块,栈块,堆块,内联块。 全局块:不会捕获任何状态,运行时也无需...

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

  • 《Effective Objective-C 2.0编写高质量i

    37. 理解 “块” 这一概念 实例: 全局块、栈块及堆块 要点总结 块(block)是C、OC、C++中的词法闭...

网友评论

    本文标题:栈块 堆块 全局块

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