Block是否循环引用

判断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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容