美文网首页
block为什么用copy?

block为什么用copy?

作者: JanetDong | 来源:发表于2017-01-22 16:01 被阅读44次

默认情况下,block是存档在栈中,可能被随时回收,需要copy操作。这也就是我们在定义block的时候用的是copy,而不是weak等等。

来看下面这个block定义:

// 默认是放在栈中,可能会被随时销毁

void (^blockName)() = ^{

};

// 进行一次copy操作,就可以放在堆中了。

// [blockName copy];

// 以下方法也一样。但是只能在非ARC中使用。

// Block_copy(blockName);

// 用retain没有用的原因:retain只是增加一次计数,block内存还是在栈中,并没有转移到堆中。

再看下面这个block使用:

Person *person = [[Person alloc] init];

person.blockName = ^{

   person.age = 20;

};

如果block是copy,并且里面使用它所在的类的对象的话,这个对象永远无法被释放。即person对象在堆中是强指针,且person在blockName就在,而blockName指向的代码也在堆中,即它的person.age=20的那些代码也在堆中,而这些代码中有person对象,所以又反过来指向person对象。就这么在相互指向的,永远不能释放。

解决方法,使用__weak修饰外部变量:

Person *person = [[Person alloc] init];

__weak Person *person0 = person;

person.blockName = ^{

   person0.age = 20;

};

相关文章

  • iOS高级面试

    1、修饰属性有哪几个?追问 为什么用copy?weak对象为nil的底层原理?2、block是什么?block有几...

  • 2019 iOS面试题大全---全方面剖析面试(下)

    1、iOS block 的原理,block 的属性修饰词为什么用 copy,使用 block 时有哪些要注意的? ...

  • block为什么用copy?

    默认情况下,block是存档在栈中,可能被随时回收,需要copy操作。这也就是我们在定义block的时候用的是co...

  • block

    block为什么用copy修饰? 因为在MRC下block默认是存储在栈上的,栈上的内存很可能随时会被释放,blo...

  • Copy 和 MutableCopy

    日志输出 Copy 和 MutableCopy block为什么要使用copy block使用copy是在MRC中...

  • Block

    1、如果没有对block进行copy操作,block存储于栈空间如果对block进行copy操作,block存储于...

  • block学习

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

  • Block底层代码

    这里只简单列举block底层用到的部分函数 _Block_copy _Block_byref_copy _Bloc...

  • Block为什么用copy修饰

    默认情况下,block是存档在栈中,可能被随时回收,通过copy操作可以使其在堆中保留一份, 相当于一直强引用着,...

  • 为什么用 copy 修饰 block

    属性可以存储一个代码块。为了让它存活到定义的块的结束,必须使用 copy (block 最早在栈里面创建,使用 c...

网友评论

      本文标题:block为什么用copy?

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