场景:从另一个页面跳转到TestViewController的页面,返回时测试循环引用,是否内存释放。
@interface TestViewController ()
/// 为什么block用copy修饰的详情参考:https://stackoverflow.com/questions/14649661/defining-objective-c-blocks-as-properties-best-practice/14650386
@property (nonatomic, copy) void (^callBack)(NSString *name);
@end
@implementation TestViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
[self setCallBack:^(NSString *name) {
NSLog(@"%@ %@", self, name);
}];
self.callBack(@"当当当当当");
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
[self.navigationController popViewControllerAnimated:true];
}
- (void)dealloc {
NSLog(@"%s %@", _cmd, self);
}
@end
这里会产生循环引用,
__weak typeof(self) weakSelf = self;
[self setCallBack:^(NSString *name) {
[NSThread sleepForTimeInterval:5];
NSLog(@"%@ %@", weakSelf, name);
}];
self.callBack(@"当当当当当");
__weak typeof(self) weakSelf = self;
[self setCallBack:^(NSString *name) {
__strong typeof(weakSelf) strongSelf = weakSelf;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[NSThread sleepForTimeInterval:5];
NSLog(@"%@ %@", strongSelf, name);
});
}];
self.callBack(@"当当当当当");
参考 一树红霞 的 __weak和__strong的使用
__weak 弱引用,引用计数不增加,若对象的引用计数为0了(释放了),则变为空指针,不为野指针。一般在block外声明变量,防止循环引用。
__strong强引用,引用计数不增加。一般在block里对弱变量声明强引用,在block执行后,对象被强引用持有,不被释放。防止对象提前释放,且不会产生循环引用。
但是好像省略__strong也是同样的效果。
__strong是默认的强引用,可省略。
网友评论