美文网首页iOS Developer程序员
block为什么要用copy修饰

block为什么要用copy修饰

作者: 蚂蚁安然 | 来源:发表于2017-03-17 18:17 被阅读0次

    Block分为全局Block、堆Block和栈Block

    1 先将工程中的ViewController切换到MRC模式:

    - (void)viewDidLoad {
    
    [super viewDidLoad];
    
    //__NSGlobalBlock__ 全局区的 (没有引用外部变量)
    
    void (^DemoBlock)() = ^{
    
    NSLog(@"DemoBlock");
    
    NSLog(@"%@",DemoBlock);
    
    int a = 6;
    
    //__NSStackBlock__ 栈区 (内部使用了外部变量)(MRC模式下)
    
    void (^DemoBlock2)() = ^{
    
    NSLog(@"DemoBlock2 %d",a);
    };
    
    NSLog(@"DemoBlock2 %@",DemoBlock2);
    
    //__NSMallocBlock__ 堆区 ([DemoBlock2 copy]后Block存放在堆区)
    
    NSLog(@"DemoBlock2.Copy %@",[DemoBlock2 copy]);
    
    void (^DemoBLock3)() = [DemoBlock2 copy];
    
    NSLog(@"DemoBlock3 %@",DemoBLock3);
    
    }
    

    切换方法:

    在工程Build Phases的Compile Sources中,将需要切换为MRC的类文件后加上-fno-objc-arc即可

    ARC和MRC混编.png

    2 定义三个无参无返回值类型的Block,分别打印Block的内存地址

    Log信息:

    2016-06-13 19:11:03.712 02-Block为什么使用copy修饰[10956:548330] DemoBlock:<__NSGlobalBlock__: 0x100d2b0a0>
    
    2016-06-13 19:11:03.713 02-Block为什么使用copy修饰[10956:548330] DemoBlock2 <__NSStackBlock__: 0x7fff5eed4950>
    
    2016-06-13 19:11:03.713 02-Block为什么使用copy修饰[10956:548330] DemoBlock2.Copy <__NSMallocBlock__: 0x7ff1a9d19270>
    
    2016-06-13 19:11:03.713 02-Block为什么使用copy修饰[10956:548330] DemoBlock3 <__NSMallocBlock__: 0x7ff1a9d9c590>
    

    分析:

    DemoBlock内部没有调用外部变量时存放在全局区(ARC和MRC下均是)

    DemoBlock2使用了外部变量,这种情况也正式我们平时所常用的方式,Block的内存地址显示在栈区,栈区的特点就是创建的对象随时可能被销毁,一旦被销毁后续再次调用空对象就可能会造成程序崩溃,在对block进行copy后,block存放在堆区.所以在使用Block属性时使用Copy修饰,而在ARC模式下,系统也会默认对Block进行copy操作

    相关文章

      网友评论

        本文标题:block为什么要用copy修饰

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