美文网首页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学习

    block为什么是用copy修饰 block属性的声明,首先需要用copy修饰符,因为只有copy后的block才...

  • iOS随笔

    *Property属性 *沙盒 内存区域划分 Block为什么要用copy修饰 Block为什么不用retain修...

  • block

    目录 一、通常作用; 二、block用来解决什么问题? 三、为什么要用copy修饰Block; 四、为什么Bloc...

  • 9.Block的写法,及使用注意

    1.Block为什么要用copy来修饰 默认情况下,block是存档在栈中,可能被随时回收,通过copy操作可以使...

  • 为什么block要用copy修饰?

    简单的答案:首先在官方文档《Programming with Objective-C》里面写到,初学阅读的时候没有...

  • block为什么要用copy修饰

    Block分为全局Block、堆Block和栈Block 1 先将工程中的ViewController切换到MRC...

  • ios开发之修饰符copy

    在开发中,我们经常说copy用来修饰block或者nsstring字符串。那么究竟为什么要用copy而不用stro...

  • block的应用以及为什么用 copy 修饰block

    那么 block为什么要用copy修饰呢? 下面的内容来自互联网,非原创,做了一点修改。 简单来说,block就像...

  • iOS中为什么block用copy属性

    Block的声明和线程安全 Block属性的声明,首先需要用copy修饰符,因为只有copy后的Block才会在堆...

  • [转] iOS: ARC和非ARC下使用Block属性的问题

    1. Block的声明和线程安全 Block属性的声明,首先需要用copy修饰符,因为只有copy后的Block才...

网友评论

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

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