gbk*_*gbk 1 null block objective-c weak ios
我想在块中使用弱自我,但是在块中这个 weakSelf 变为 nil
刚刚创建,在阻止之前(尝试使用不同的变体) - 看起来一切正常
但后来在块中 - 每个变体都为零
做错了什么?谁能解释一下?
编辑
SPHVideoPlayer *videoPlayer = [[SPHVideoPlayer alloc] initVideoPlayerWithURL:urlToFile];
[videoPlayer prepareToPlay];
Run Code Online (Sandbox Code Playgroud)
初始化
#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];
}
Run Code Online (Sandbox Code Playgroud)
还有使用块的方法
- (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];
});
}];
}
Run Code Online (Sandbox Code Playgroud)
正如 rckoenes 所建议的那样,这SPHVideoPlayer
超出了范围并正在发布。假设您不希望它被释放,您只需要选择一个保持它的范围(例如,使其成为显示视频的视图控制器的属性)。
您描述了您使用weakSelf
来防止“保留循环”(现在通常称为“强引用循环”)。是的,该weakSelf
模式用于防止强引用循环。从技术上讲,并不完全清楚您是否一定有一个强大的参考周期。这取决于loadValuesAsynchronousForKey...
实现的细节(例如,此块是否加载到某个类属性中,从而创建了从类到块类属性引用的强引用循环 ,而块类属性引用self
又维护了对 的强引用self
)。
但这有点学术性:weakSelf
尽管如此,该模式还是谨慎的,因为它准确地反映了适当的对象图(该块没有业务“拥有”和/或维护对视频播放器的强引用)。不过,巧合的是,当您使用 时weakSelf
,也消除了强引用循环的潜在风险。
真正的问题是,您可能不仅希望在加载资产时将视频播放器保持在范围内,而且在播放视频时也希望将视频播放器保持在范围内,因此无论如何您都想更改视频播放器的范围(大概是为了匹配呈现视频播放器的视图控制器。
归档时间: |
|
查看次数: |
3451 次 |
最近记录: |