ios - nil __weak self - 为什么会这样?

标签 ios objective-c block null weak

我想在 block 中使用弱自我,但是在 block 中这个weakSelf变成了nil

刚刚创建,在 block 之前(尝试使用不同的变体) - 看起来一切正常

enter image description here

但后来在 block - 每个变种为零

enter image description here

做错了什么?谁能解释一下?

编辑

SPHVideoPlayer *videoPlayer = [[SPHVideoPlayer alloc] initVideoPlayerWithURL:urlToFile];
[videoPlayer prepareToPlay];

初始化
#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];
}

以及使用 block 的方法
- (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 所建议的,这 SPHVideoPlayer超出范围并被释放。假设您不希望它被释放,您只需要选择一个保持它的范围(例如,使其成为显示视频的 View Controller 的属性)。

您描述了您对 weakSelf 的使用情况。防止“保留循环”(现在通常称为“强引用循环”)。是的,weakSelf模式用于防止强引用循环。从技术上讲,您是否一定有一个强大的引用周期并不完全清楚。这取决于 loadValuesAsynchronousForKey... 的详细信息实现(例如,是否将此 block 加载到某个类属性中,从而创建从类到 self 的 block 类属性引用的强引用循环,这反过来又保持对 self 的强引用)。

但这有点学术性:weakSelf尽管如此,模式还是谨慎的,因为它准确地反射(reflect)了适当的对象图(该 block 没有业务“拥有”和/或保持对视频播放器的强引用)。不过巧合的是,当您使用 weakSelf ,也消除了强引用周期的潜在风险。

真正的问题是,您可能不仅要在加载 Assets 时将视频播放器保持在范围内,而且还要在播放视频时,所以无论如何您都希望更改视频播放器的范围(大概是为了匹配呈现视频播放器的 View Controller 。

关于ios - nil __weak self - 为什么会这样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27251840/

相关文章:

ios - Swift 中的自动换行标签

iphone - 错误的访问错误我不太明白

iOS 键盘使 View 消失

ios - 我不知道对于 objective-c 中的文字范围我应该避免什么样的 block 模式

c - 使用 C 分割 wav 文件

java - 静态 block 实例 block java 命令

objective-c - viewWillAppear 未被调用

ios - Swift 中的 Outlet 集合导致错误 254

objective-c - 为什么只有 NSLog 警告我使用 NSUInteger 的 %lu 字符串格式说明符?

objective-c - 基于项目的 NSDocument 工作流