0

次のシナリオでは、クラッシュします

    if (self.videoEngine != nil)
{
    [self.videoEngine.player.view removeFromSuperview];

    [videoEngine release];
    self.videoEngine = nil;
}

videoEngine オブジェクトは (nonatomic、retain) であり、videoEngine = _videoEngine を使用して合成されます。self.videoEngine = nil 行を削除すると、コードは正しく機能します。これは正しい動作ですか? nil 行がクラッシュするのはなぜですか? self.videoEngine = nil は引き続き viewDidUnload 関数内で問題を引き起こしますか?

4

2 に答える 2

5

「self.videoEngine = nil;」を呼び出すと、セッターメソッドを呼び出し、デフォルトではセッターメソッドでオブジェクトを解放してから、提供された値に設定するため、この場合、オブジェクトを一度解放し、セッターメソッドが再度解放しようとしています。 「[videoEngine release];」を削除すると、クラッシュが発生します。それは問題なく、メモリリークはありません。

それが今はっきりしていることを願っています。

于 2012-07-23T11:32:41.670 に答える
0

これが合成された名前であるため、_videoEngine のみをリリースする必要があります。videEngine はセッターとゲッターの名前だけですが、値は合成された名前で格納されます。したがって、コードは次のようになります。

    if (self.videoEngine != nil)
{
    [self.videoEngine.player.view removeFromSuperview];

    [_videoEngine release];
    self.videoEngine = nil;   // Unnecessary

}

しかし、setter は常に nil を返すため、_videEngine を解放した後に self.videEngine = nil を呼び出す必要はありません。

setter メソッドを nil で呼び出すことによる解放の適切な方法とは見なされませんが、次の行で行われるように機能しますself.videoEngine = nil; // Unnecessary。リリースの正しい方法は、[_videoEngine release];

于 2012-07-23T13:07:02.417 に答える