频道栏目
首页 > 程序开发 > 移动开发 > 其他 > 正文
block的循环引用的问题
2017-02-22 09:49:29      个评论    来源:Xiaoxiao_Beijixiong的博客  
收藏   我要投稿

在我们的编写代码的时候,常常会出现一些循环引用的问题,今天就说说block的循环引用,引起的对象无法被释放的问题

先说一下我们验证问题的方法:

    -1.Navigationcontroller嵌套vc1;
    -2.由vc来push vc2;

    当vc2 pop控制器的时候会释放vc2对象

下面是vc2中主要代码:

#import "ViewController.h"

@interface ViewController ()

@property (nonatomic, copy) void(^block)();

@end

@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];

    // 定义一个block
    void (^task)() = ^{
        NSLog(@"%@",self);
    };

    // 赋值
    self.block = task;

    // 执行block
    self.block();
}
// 查看对象是否销毁
- (void)dealloc{
    NSLog(@"ViewController再见");
}

这个时候pop,vc的dealloc方法不会被调用,因为在block中,获取了self自身,而block是self创建的一个属性,造成了循环引用的技术问题

这时,我们的解决方法就是:
创建一个弱指针,指向self,然后在block中调用这个若指针
这样做的目的是,在block中不要有强指针指向self,用一个弱指针来代替self,可以获取到self的同时,也不影响self的生死

有3中方法创建需要的弱指针:

    // 方式01
__weak typeof(self) weakSelf = self;
    // 方式02
__weak ViewController *weakSelf = self;
    // 方式03 (这种方式已经不再使用了 而且快速访问和返回 会导致野指针访问)
__unsafe_unretained  typeof(self) weakSelf = self;

同理,在block中引用self的成员变量也会造成循环引用问题,解决方法同上.

点击复制链接 与好友分享!回本站首页
相关TAG标签 block循环引用
上一篇:获取手机联系人信息
下一篇:SystemServer进程源码分析之一
相关文章
图文推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站