1. ホーム
  2. オブジェクティブC

[解決済み】このブロックで自己を強く捉えると、リテインサイクルになりそうです。

2022-04-08 23:09:28

質問

xcodeでこの警告を回避するにはどうしたらよいですか?以下はコードスニペットです。

[player(AVPlayer object) addPeriodicTimeObserverForInterval:CMTimeMakeWithSeconds(0.1, 100)
queue:nil usingBlock:^(CMTime time) {
    current+=1;

    if(current==60)
    {
        min+=(current/60);
        current = 0;
    }

    [timerDisp(UILabel) setText:[NSString stringWithFormat:@"%02d:%02d",min,current]];///warning occurs in this line
}];

解決方法は?

のキャプチャは self の暗黙のプロパティアクセスで入ってきています。 self.timerDisp - を参照することはできません。 self またはプロパティで self が強く保持するブロックから self .

への弱い参照を作成することで、これを回避することができます。 self にアクセスする前に timerDisp をブロック内で使用します。

__weak typeof(self) weakSelf = self;
[player addPeriodicTimeObserverForInterval:CMTimeMakeWithSeconds(0.1, 100)
                                     queue:nil
                                usingBlock:^(CMTime time) {
                                                current+=1;

                                                if(current==60)
                                                {
                                                    min+=(current/60);
                                                    current = 0;
                                                }

                                                 [weakSelf.timerDisp setText:[NSString stringWithFormat:@"%02d:%02d",min,current]];
                                            }];