美文网首页
Block内存管理

Block内存管理

作者: 半岛夏天 | 来源:发表于2018-09-29 00:20 被阅读6次

我们知道block会持有自动变量,例如:

{
int a = 10;
void (^blk) = ^{NSLog(@"%d",a)};
a = 20;
blk();
}

打印结果为10,原因是这段代码在编译之后,block拷贝了一份a的值到block编译生成的DATA结构体中,所以a在其他地方无论改成什么值,block里面的值都是10。

但是如果将 a 声明改成 __block int a = 10; 代码编译的时候对a这块的处理会声明成一个结构体,block中保留的是结构体的指针,在外面改了值之后,通过这个指针可以拿到新的值。

这样就引入了一个循环引用的问题:

typedef void (^blk_t)(void);

@interface MyObject : NSObject
{
blk_t blk;
}

@end

@implementation MyObject

- (id)init
{
self = [super init];
blk = ^{NSLog(@"self = %@",self);};
return self;
}

int main()
{
id o = [[MyObject alloc] init];
return 0;
}

这段代码 会造成Block的循环引用,为什么呢? 因为blk是strong属性的,blk里面访问了self,那blk会持有一份self的拷贝,这样就造成了循环引用。

另外一种情况是:

@interface MyObject : NSObject
{
blk_t blk;
id  obj;
}

- (id)init
{
self = [super init];
blk = ^{NSLog(@" %@",obj);};
return self;
}

同样会造成循环引用,原因同上。

那我们要怎么处理这种方式呢?

    1. 是在block里面访问self之前 先声明一个weak 的self去访问。
    1. 就是使用__block 的self去访问
- (id)init
{
self = [super init];
id __weak tem = self; // or  __block id tem = self;
blk = ^{NSLog(@"self = %@",tem);};
return self;
}

用weak的原因就不解释了,__block修饰之后 block复制的是一个对象的结构体指针,不会持有这个对象,(第一个例子 __block a 能改变值也是这个原因)。

更多关于Block的优秀博客:

  1. iOS Block深层次总结和一些经典的面试题(博主:Deft_MKJing宓珂璟)
  2. 关于block使用的5点注意事项

相关文章

  • Block内存管理实例分析

    Block内存管理实例分析 Block内存管理实例分析

  • Block内存管理

    对block自身内存的管理 对于block,有两个内存管理方法:Block_copy, Block_release...

  • iOS内存管理详解

    目录 block内存管理 autorelease内存管理 weak对象内存管理 NSString内存管理 new、...

  • Block 使用总结

    Block 内存管理: Block 内存主要分派到 NSGlobalBlock(data area),NSMall...

  • iOS面试之Block大全

    Block Block内容如下: 关于Block 截获变量 __block修饰符 Block的内存管理 Block...

  • iOS面试之Block模块

    Block Block内容如下: 关于Block 截获变量 __block修饰符 Block的内存管理 Block...

  • Block

    一、Block本质 二、 BlocK截获变量 三、__block 修饰变量 四、Block内存管理 五、Block...

  • Block

    Block介绍 截获变量 __block修饰符 Block的内存管理 Block的循环引用 一、Block介绍 1...

  • block的内存管理

    block的内存默认放在栈中,(开发人员不需要管理block内存),block所引用的对象的retainCount...

  • block的一些注意事项

    Block的使用注意: block的内存管理(注意循环引用,默认在栈中(不需要内存管理),通过copy就在在堆中,...

网友评论

      本文标题:Block内存管理

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