OC知识

OC 之 各种block 处理weakSelf

2017-07-26  本文已影响64人  wustzhy

$ 问题抛出来

1.所有自定义方法的block都需要__weak 吗?
2.凡是, block内带 self的都需要 __weak 吗?
3.凡是, 系统方法中的block, 都不需要__weak 吗?

  看看上述问题的反问语气, 相必语文过关的同学们都知道答案,一看就是 No No No ~         
  -> 😄 恭喜你~ right !

$ but why ?

至于原因 👇

想必大伙都知道, 互相strong持有成了一个环 , 然后就无法释放了~


$ block 常见场景(暂时想到的一些情况, 后续想到继续补充)

first, code准备:
👇 一个子View -- TestOneView, 创建各种参数为block的方法

 //  TestOneView.h
 #import <UIKit/UIKit.h>

 typedef void(^ZYOneBlock1)();

 typedef void(^ZYOneBlock2)();

 @interface TestOneView : UIView
 // copy修饰 
 @property (nonatomic,   copy)     ZYOneBlock1 oneBlock;
 // weak修饰
 @property (nonatomic,   weak)     ZYOneBlock1 weak_oneBlock;
 
 // 持有 传入的block , 但是 weak
 - (void)testWeakBlock:(ZYOneBlock1) block;

 // 不持有 传入的block , 在method中直接执行掉
 - (void)testBlock2WithBlock:(ZYOneBlock2) secondblock;

 @end
  // TestOneView.m
  #import "TestOneView.h"

  @implementation TestOneView

  /*
  // Only override drawRect: if you perform custom drawing.
  // An empty implementation adversely affects performance during animation.
  - (void)drawRect:(CGRect)rect {
      // Drawing code
  }
  */

  // 持有 传入的block , strong
  -(void)setOneBlock:(ZYOneBlock1)oneBlock{
      
      _oneBlock = oneBlock;
      _oneBlock();
  }

  // 持有 传入的block , 但是 weak
  - (void)testWeakBlock:(ZYOneBlock1) block;
  {
      self.weak_oneBlock = block;
  }

  // 不持有 传入的block , 在method中直接执行掉
  - (void)testBlock2WithBlock:(ZYOneBlock2) secondblock;
  {
      secondblock();
  }
  
  // 通过dealloc 检测能否释放
  -(void)dealloc{
      NSLog(@"%s",__func__);
  }

  @end

go on ~ , code一个被push的VC -- TestOneViewController , 即是 block纵横所在的江湖

😏😏😏 block 出场 😏😏😏



超懒人 点击 github demo 下载 调试 。
祝愿有所收获哦 ~ _ ~

上一篇 下一篇

猜你喜欢

热点阅读