Block循環(huán)引用
typedef void (^blk_t)(void);
@interface JAXObject : NSObject {
blk_t blk_;
}
@end
@implementation JAXObject
- (instancetype)init {
if (self = [super init]) {
blk_ = ^{
NSLog(@"self = %@", self);
};
}
return self;
}
- (void)dealloc {
NSLog(@"dealloc");
}
@end
int main(int argc, const char * argv[]) {
JAXObject *o = [[JAXObject alloc] init];
NSLog(@"%@", o);
return 0;
}
沒有調(diào)用dealloc
o 持有blk_
blk_持有o, __weak避免循環(huán)引用
@implementation JAXObject
- (instancetype)init {
if (self = [super init]) {
__weak JAXObject *weakSelf = self;
blk_ = ^{
NSLog(@"self = %@", weakSelf);
};
}
return self;
}
- (void)dealloc {
NSLog(@"dealloc");
}
@end
也可以用__Block 解除循環(huán),但必須要調(diào)用block。
@implementation JAXObject
- (instancetype)init {
if (self = [super init]) {
__block JAXObject *blockSelf = self;
blk_ = ^{
NSLog(@"self = %@", blockSelf);
blockSelf = nil;
};
}
return self;
}
- (void)dealloc {
NSLog(@"dealloc");
}
- (void)exexblock {
blk_();
}
@end
int main(int argc, const char * argv[]) {
JAXObject *o = [[JAXObject alloc] init];
[o exexblock];
return 0;
}
執(zhí)行dealloc調(diào)用