1

ブロックで弱いセルフを使いたいのですが、ブロックではこのweakSelfがnilになります

ブロックの前に作成されたばかりです(別のバリアントを使用してみてください)-すべて問題ないように見えます

ここに画像の説明を入力

しかし、ブロックの後半 - 各バリアント nil

ここに画像の説明を入力

何が間違っていたのですか?誰でも説明できますか?

編集

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];
}

また、ブロックを使用するメソッド

- (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];
        });
    }];
}
4

3 に答える 3

3

これが弱い変数の考え方です。弱い変数は参照カウントを保持しないため、オブジェクトを保持する唯一のものが弱い変数である場合、オブジェクトの割り当てが解除され、弱い変数は nil になります。これは、弱い変数がどのように機能し、使用されることになっている 100% の方法です。

強い参照を使用していた場合、ブロックはまだ自分自身を保持している唯一のコードであり、自分自身で行うすべての作業は無意味です。他の誰もそれに気付かないからです。弱い変数を使用しているため、変数が nil かどうかを確認することでこれを回避できます。

マルチスレッド環境では、最後の強参照がいつでもなくなり、弱参照がいつでも nil になる可能性があります。これを回避するには、ブロックの最初に弱い変数を強い変数にコピーすることで、ブロックに入る前に弱い変数が消えている可能性があることを知っていますが、ブロックの実行中には消えません。

于 2014-12-02T15:22:50.233 に答える
1

ブロックの弱い参照を持つ理由は、ブロックでクラスを保持しないためです。インスタンスが存在しなくなると、弱い参照は nil になるため、それに応じて弱い参照を処理する必要があります (コードで行います)。それが達成したいことではない場合は、インスタンスの割り当てが解除されていないことを確認する必要がありますが、それはブロックとは関係ありません...

于 2014-12-02T14:46:49.243 に答える