![](/img/trans.png)
[英]Is dispatch_async(dispatch_get_main_queue(), …) necessary in this case?
[英]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;
});
weakSelf
位于主队列中,它会始终可用/有效吗? strongSelf
吗? 您的代码段太小,无法完全回答您的问题。
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
在这个变量”
如果您不想丢失对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.