block 相关问题

来源:互联网 发布:linux怎么找漏洞 编辑:程序博客网 时间:2024/06/05 05:38

1、为什么用copy

block本身是像对象一样可以retain,和release。但是,block在创建的时候,它的内存是分配在栈(stack)上,而不是在堆(heap)上。他本身的作于域是属于创建时候的作用域,一旦在创建时候的作用域外面调用block将导致程序崩溃。
使用retain也可以,但是block的retain行为默认是用copy的行为实现的,

2、

__block和__weak有什么区别?

  • __block不管是ARC还是MRC模式下都可以使用,可以修饰对象,还可以修饰基本数据类型。
  • __weak只能在ARC模式下使用,也只能修饰对象(NSString),不能修饰基本数据类型(int)。
  • __block对象可以在block中被重新赋值,__weak不可以。

  • 3、循环引用:

     循环引用就是当self 拥有一个block的时候,在block 又调用self的方法。形成你中有我,我中有你,谁都无法将谁释放的困局。

     self.myBlock = ^{    [self doSomething];  };       +-----------+           +-----------+       |    self   |           |   Block   |  ---> |           | --------> |           |       | retain 2  | <-------- | retain 1  |       |           |           |           |       +-----------+           +-----------+
    又或者

    ClassA* objA = [[[ClassA alloc] init] autorelease];  objA.myBlock = ^{    [self doSomething];  };  self.objA = objA;  +-----------+           +-----------+           +-----------+  |   self    |           |   objA    |           |   Block   |  |           | --------> |           | --------> |           |  | retain 1  |           | retain 1  |           | retain 1  |  |           |           |           |           |           |  +-----------+           +-----------+           +-----------+       ^                                                |       |                                                |       +------------------------------------------------+
    解决方法:

    __weak typeof (self) weakSelf = self;

  • 0 0