繁体   English   中英

dispatch_async队列(dispatch_get_main_queue(),^ {})内的weakself

[英]weakself inside dispatch_async queue(dispatch_get_main_queue(), ^{})

下面的代码段在目标C中

__weak MyView *weakSelf = self;
dispatch_async(dispatch_get_main_queue(), ^{
    [weakSelf.activityIndicatorView stopAnimating];
    [weakSelf.activityIndicatorView removeFromSuperview];
    weakSelf.activityIndicatorView = nil;
});
  1. 由于weakSelf位于主队列中,它会始终可用/有效吗?
  2. 仅在块不是主队列时才需要声明strongSelf吗?

您的代码段太小,无法完全回答您的问题。

  1. weakSelf可以为nil或为非nil。 关键字weak意味着在某些情况下变量weakSelf可以变为nil 例如,如果您的控制器具有以下属性:

     @property (retain) MyView* myView; 

    在某些情况下,您可以关闭此控制器,然后为myView调用方法f

     [self dismissViewControllerAnimated:YES completion:^{ [self.myView f]; }]; 

    方法f的代码基于您在此问题中提供的代码片段:

     -(void)f { [self removeFromSuperview]; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 5 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ __weak MyView *weakSelf = self; dispatch_async(dispatch_get_main_queue(), ^{ [weakSelf.activityIndicatorView stopAnimating]; [weakSelf.activityIndicatorView removeFromSuperview]; weakSelf.activityIndicatorView = nil; }); }); } 

    我想您会在调试器中看到,当您尝试为activityIndicatorView调用stopAnimating时, weakSelf将为nil 而且我猜想您将很容易重现不清除weakSelf的情况。 这意味着,你的第一个问题的答案是“不, weakSelf将不总是可用/有效,主线程不保护你从nil在这个变量”

  2. 如果您不想丢失对block内部变量的引用,则需要使用strongSelf__strong而不是__weak )。 例如,如果在MyView类中有一个方法log记录了一些调试信息:

     -(void)log { NSLog(@"LOG"); } 

    而且,如果要始终在调用代码片段中的代码之后记录信息,请使用以下版本的方法f

     -(void)f { [self removeFromSuperview]; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 5 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ __strong MyView *weakSelf = self; dispatch_async(dispatch_get_main_queue(), ^{ [weakSelf.activityIndicatorView stopAnimating]; [weakSelf.activityIndicatorView removeFromSuperview]; weakSelf.activityIndicatorView = nil; [weakSelf log]; }); }); } 

    因此,第二个问题的答案是“不,您需要根据应用程序使用__strong ,该块可以在不同的线程中完成”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM