Block是否循环引用

2017-10-30  本文已影响7人  ZCY_YAM

判断block 内部是否循环引:自己持有对象是否持有自己。

#interface Student :NSobject
@property(copy,nonatomic) void(^callBlock)(void);
@end
-(void)testBlockFunc:(void(^)(void))blockFunc;
1对象不持有block
@implementation Student
-(void)testBlockFunc:(void(^)(void))blockFunc
{
      blockFunc();
      NSLong("Hello");
}
@end
2对象持有block
@implementation Student
-(void)TestBlockFunc:(void(^)(void))blockFunc
{
      self.callBlock = [blockFunc copy];
      self.callBlock();
      NSLong("Hello");
}
@end

下面生成调用

@interface ViewController()
@property(nonatomic,strong)Student*ss
@end
@implementation ViewController
//第一种栈block
-(void)viewDidLoad{
  Student * student = [Student New];
  [student testBlockFunc:(^){
  self.view...
}];
// 这个时候需要weak self;  因为self 不持有student
}

//第二种 
-(void)viewDidLoad{
//testBlockFunc 实现方式为1 
  self.ss = [Student New];
  [self.ss testBlockFunc:(^){
  self.view...
}];
//这时候 也不需要weak self  虽然B持有ss   block持有B  但是ss不持有block  不能生成闭环 所以不会循环
}
//第三种 
-(void)viewDidLoad{
//testBlockFunc 实现方式为2
  self.ss = [Student New];
  [self.ss testBlockFunc:(^){
  self.view...
}];
//这时候 需要weak self  虽然B持有ss   block持有B  但是ss持有block  生成闭环 所以会循环 
}
@end
上一篇下一篇

猜你喜欢

热点阅读