判断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
网友评论