nil __weak self - Why it's happend?
我想在街区里使用软弱的自我,但在街区里,这个懦夫变成了零。
刚刚创建,在块之前(尝试使用不同的变体)-看起来都可以
但后来在块-每个变种零
怎么了?有人能解释吗?
编辑
1 2 | SPHVideoPlayer *videoPlayer = [[SPHVideoPlayer alloc] initVideoPlayerWithURL:urlToFile]; [videoPlayer prepareToPlay]; |
初始化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #pragma mark - LifeCycle - (instancetype)initVideoPlayerWithURL:(NSURL *)urlAsset { if (self = [super init]) { [self initialSetupWithURL:urlAsset]; } return self; } - (void)initialSetupWithURL:(NSURL *)url { NSDictionary *assetOptions = @{ AVURLAssetPreferPreciseDurationAndTimingKey : @YES }; self.urlAsset = [AVURLAsset URLAssetWithURL:url options:assetOptions]; } |
以及使用块的方法
1 2 3 4 5 6 7 8 9 10 11 | - (void)prepareToPlay { __weak typeof(self) weakSelf = self; __weak SPHVideoPlayer *weakSealf2 = self; NSArray *keys = @[@"tracks"]; [self.urlAsset loadValuesAsynchronouslyForKeys:keys completionHandler:^{ dispatch_async(dispatch_get_main_queue(), ^{ [weakSelf startLoading]; }); }]; } |
正如Rckoenes所说,这个
您描述了使用
但这都有点学术性:尽管如此,
真正的问题是,您可能不仅希望在加载资产时将视频播放器保持在作用域内,而且希望在播放视频时也保持在作用域内,因此您可能希望更改视频播放器的作用域,而不管(可能是为了与呈现视频播放器的视图控制器相匹配)。
这就是弱变量的概念:弱变量不包含引用计数,因此如果弱变量是保留在对象上的唯一对象,则对象将被释放,弱变量将为零。这是弱变量应该如何工作和应该如何使用的100%。
如果你使用了一个强引用,那么你的代码块将是唯一仍然保留着self的代码,你对self所做的所有工作都将是毫无意义的,因为没有其他人会注意到它。由于使用的是弱变量,因此可以通过检查变量是否为零来避免这种情况。
在多线程环境中,最后一个强引用可能随时消失,而您的弱引用可能随时变为零。通过将弱变量复制到强变量中来避免这种情况,因为这是块中的第一件事情,所以您知道在进入块之前,弱变量可能已经消失,但在块执行期间,它不会消失。
对块具有弱引用的原因是不使用块保留类。当实例不再存在时,弱引用得到零,因此您需要相应地处理弱引用(在代码中这样做)。如果这不是您想要实现的,您需要确保您的实例没有解除分配,但这与您的块无关…