美文网首页
__weak和__strong的配合使用

__weak和__strong的配合使用

作者: lanmoyingsheng | 来源:发表于2018-07-10 22:07 被阅读8次

场景:从另一个页面跳转到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是默认的强引用,可省略。

相关文章

网友评论

      本文标题:__weak和__strong的配合使用

      本文链接:https://www.haomeiwen.com/subject/uglfpftx.html