探秘ios中block的循环引用问题

hello,小伙伴们!
ios中自从引入了block,代理就在慢慢淡出我们的视野,那么block的使用大家都了解吗?它的循环引用机制大家都了解吗?接下来我们就来聊聊这个话题.

一,介绍下简单block的写法.

//a,typedef 定义下的block写法
typedef void(^cusBlock)();
@property (copy , nonatomic)  cusBlock block;

//b,直接属性定义下的block写法
@property (copy , nonatomic)  void (^customBlock)();
//还有很多写法,大家可以参考其它牛人的写法,这里就不做介绍了.

二,执行block代码块(customBlock)

 self.customBlock = ^(){
        self.name = @"lili";
        NSLog(@"执行了block块的方法");
        
    }
    }
touchesBegan后
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    
    if (self.customBlock) {
        self.customBlock();
    }
    
}
输出结果:2017-02-27 19:30:46.815 text[15115:303861] 执行了block块的方法

三,block循环引用的结论

//先说结论,后面再来分析
 如果 [block内部] 访问了 [外部强引用] 对象A ,那么 [block内部] 会自动产生一个 [强引用引用] 对象A;

 如果 [block内部] 访问了 [外部弱引用] 对象A ,那么 [block内部] 会自动产生一个 [弱引用引用] 对象A;

四,分析循环引用,验证结论

a,上述代码强引用的示意图

block强引用示意图.png

这样系统会抛出一个⚠️错误

强引用警告示意图.png

执行完block代码后

block执行完成后强引用示意图.png

这个提示告诉我们,block内部出现了循环引用(有强迫症的最好解决下,免得越积越多).

b,解决办法,大家都知道的弱引用就可以完美的解决问题了.示意图如下

block弱引用示意图.png

c,特殊情况

@interface BLPerson : NSObject
@property(copy, nonatomic) NSString *name;
@property (copy , nonatomic)  void (^customBlock)();
@end
#import "BLPerson.h"

- (void)viewDidLoad{
   [super viewDidLoad];
   self.view.backgroundColor = [UIColor whiteColor];
   BLPerson *p = [[BLPerson alloc]init];
   __weak typeof(p)weakp = p;
   p.name = @"jack";
   p.customBlock = ^(){
       dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
           weakp.name = @"lili";
           NSLog(@"%@==执行了block块的方法",weakp.name);
       });
   };
   if (p.customBlock) {
       p.customBlock();
   }
}

运行结果:2017-02-28 11:17:23.519 text[4118:80908] (null)==执行了block块的方法
weakp.name =null,这是为什么了,在block里面我明明已经将 weakp.name = @"lili"赋值了啊.

经过分析这是因为,在执行dispatch_after这个block中代码的时候,由于weakp是弱引用,在这个时间差之间weakp已经被释放了,weakp为nil,意味着nil.name就没意义了.

解决办法:在customBlock里面用一个强引用在引用weakp就行了;

 p.customBlock = ^(){ 
        BLPerson *p1 = weakp;
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            p1.name = @"lili";
            NSLog(@"%@==执行了block块的方法",p1.name);
        });
    };
输出结果:2017-02-28 11:26:41.679 text[4280:84156] lili==执行了block块的方法;这个时候P1.name是有值的;
ps:在block里面定义的属性是不会造成强引用的;

本章总结:
请大家牢记这两个结论,理解透了没有block会阻碍你前进的步伐.

如果 [block内部] 访问了 [外部强引用] 对象A ,那么 [block内部] 会自动产生一个 [强引用引用] 对象A;

 如果 [block内部] 访问了 [外部弱引用] 对象A ,那么 [block内部] 会自动产生一个 [弱引用引用] 对象A;

建议以后block里面如果没有特殊要求,建议都写成弱引用,避免造成自己都发现不了的bug.本文,如有误之处,请大家多多指教,我一定虚心学习,希望同大家共同进步.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容