前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >block与GCD--40:块的循环引用

block与GCD--40:块的循环引用

作者头像
xy_ss
发布2023-11-22 08:30:13
1740
发布2023-11-22 08:30:13
举报
文章被收录于专栏:浮躁的喧嚣

使用block时,很容易导致“保留环”

  • 第一种
代码语言:javascript
复制
#import <Foundation/Foundation.h>
typedef void(^dosomethingBlock)(NSDictionary *dic);
@interface Student : NSObject
- (void)startBlock:(dosomethingBlock)block;
- (void)callBackData;
@end

#import "Student.h"
@interface Student()
@property (nonatomic,copy) dosomethingBlock block;
@end
@implementation Student
- (void)startBlock:(dosomethingBlock)block{
    if (block) {
        _block = block;
    }
}
- (void)callBackData{
    if (_block) {
        _block(@{@"key":@"value"});
    }
}
- (void)dealloc{
    NSLog(@"%s",__func__);
}
@end
---------------------
#import "ViewController.h"
#import "Student.h"
@interface ViewController ()
@property (nonatomic,strong) Student *stu;
@property (nonatomic,strong) NSDictionary *dic;
@end
@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
   _stu =  [[Student alloc]init];
    [_stu startBlock:^(NSDictionary *dic) {
        _dic = dic;
        NSLog(@"%@",self.dic[@"key"]);
    }];
    [_stu callBackData];
}
@end

运行程序发现student的delloc不会执行,因为在dosomethingBlock引用了ViewController,而Student又是ViewController属性,存在循环引用。 修改这个bug,只需要清掉其中一个引用即可

代码语言:javascript
复制
_stu =  [[Student alloc]init];
    [_stu startBlock:^(NSDictionary *dic) {
        _dic = dic;
        NSLog(@"%@",self.dic[@"key"]);
        _stu = nil;
    }];
    
    [_stu callBackData];
  • 第二种
代码语言:javascript
复制
typedef void(^dosomethingBlock)(NSDictionary *dic);
@interface Student : NSObject
- (void)startBlock:(dosomethingBlock)block;
- (void)callBackData;
@end

#import "Student.h"
@interface Student()
@property (nonatomic,copy) dosomethingBlock block;
@end
@implementation Student
- (void)startBlock:(dosomethingBlock)block{
    if (block) {
        _block = block;
    }
}
- (void)callBackData{
    if (_block) {
        _block(@{@"key":@"value"});
    }
}
- (void)dealloc{
    NSLog(@"%s",__func__);
}
@end

#import "ViewController.h"
#import "Student.h"
@interface ViewController ()
@property (nonatomic,strong) NSDictionary *dic;
@end
@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    Student *_stu =  [[Student alloc]init];
    [_stu startBlock:^(NSDictionary *dic) {
        _dic = dic;
        NSLog(@"%@--%@",self.dic[@"key"],_stu);
    }];
    
    [_stu callBackData];
}
@end

运行程序发现student的delloc不会执行,因为在dosomethingBlock引用了_stu自己,存在循环引用。 修改这个bug,只需要清掉其中一个引用即可

代码语言:javascript
复制
- (void)callBackData{
    if (_block) {
        _block(@{@"key":@"value"});
        _block = nil;
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-08-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档