ARC下的block导致的循环引用问题解析

  1. 云栖社区>
  2. 博客>
  3. 正文

ARC下的block导致的循环引用问题解析

游贤明 2016-04-18 17:18:43 浏览951
展开阅读全文

ARC下的block导致的循环引用问题解析

更详细细节请参考 http://blog.sina.com.cn/s/blog_8c87ba3b0101m599.html

 

ARC下,copy到堆上的block,会强引用进入到该block中的外部变量.这很容易导致循环引用的问题.

比方说:

一个VC(这里指一个controller)中有一个属性为model.VC强引用了它.

VC --> model

这个model呢,里面有一个copy属性的block,该block赋值如下如下.model.demo = ^{

    ......

};

如果这个......没有传VC进来,还好,不会强引用VC,如果是下面的情况:

model.demo = ^{

    ......

    [test getValue:self];

};

那,直接导致的后果就是,这个model强引用了这个VC.

model --> VC

这就造成了一个循环.即使这个VC被pop掉了,垃圾回收机制也无法释放这个VC了,因为,它检测到了这个VC被model强引用了.

 

 

所以,在ARC下面使用block,无论怎样,你都需要注意这几点:

1.  外部对象进入block,请使用__weak修饰后再进入到block中

2.  不要在block中初始化对象,请在block的外面初始化对象后再进入到block中去

3.  无论该block是不是copy的,请都当做copy的block来处理

4.  传入到堆区block中的对象会被强引用

网友评论

登录后评论
0/500
评论
游贤明
+ 关注