0

作成しているテストアプリケーションでクラッシュが発生しましたが、これはメモリ管理によるものだと確信しています。この問題に関連する3つの質問があります:

質問A:

// Within singleton : GraphicsUtility
-(UIColor*)GetRandomColor
{
    float l_fRandomRedColor = [[MathUtility instance] GetRandomFloatNumberBetweenNumber:0.0f AndNumber:1.0f];
    float l_fRandomBlueColor = [[MathUtility instance] GetRandomFloatNumberBetweenNumber:0.0f AndNumber:1.0f];
    float l_fRandomGreenColor = [[MathUtility instance] GetRandomFloatNumberBetweenNumber:0.0f AndNumber:1.0f];

    return [UIColor colorWithRed:l_fRandomRedColor
                    green: l_fRandomGreenColor
                        blue: l_fRandomBlueColor
                        alpha: 255];
}

さて、車輪の再発明をせずにこのオブジェクトへのポインタを返す方法がわかりません。このメソッドcolorWithRed:green:blue:alphaは(新しい)ものを割り当てたり作成したりしないので、そうすべきではないと思いますretain

私はautoreleaseそれをすべきですか?

質問B:

次のように、別のクラスでオブジェクトを取得する場合:

// Within class : Test.
// mpCurrentPieceColor is a class variable.
mpCurrentPieceColor = [[GraphicsUtility instance] GetRandomColor];

オブジェクトへのポインタを格納しているので、UIColorもう一度保持する必要がありますか?

だから私の色を変えるとき、私はそれをするべきですか?

// Within class : Test.
// mpCurrentPieceColor is a class variable.
[mpCurrentPieceColor release];
mpCurrentPieceColor = [[GraphicsUtility instance] GetRandomColor];
[mpCurrentPieceColor retain];

私には完全に間違っているようです...

質問C:

最後に、私のdealloc方法では、これを行っています:

// Within class : Test
-(void) dealloc
{
    // never forget to call [super dealloc]
    [super dealloc];

    [mpCurrentPieceColor release];
}

それが正しいか ?

私が見つけた「最良の」解決策(そしてさらに悪いこと:))は、いくつかの場所でretainを使用することでした...私はもうクラッシュしませんでしたが、明らかに、メモリリークが発生しました...大歓迎です!ありがとう !

4

2 に答える 2

2

A:自動リリ​​ースしないでください。呼び出しているメソッドは、自動解放されたオブジェクトを返します。あなたはただパススルーとして行動しているだけです。

B&C:これらは私にはほとんど問題ないように見えます。論理的には、カラーのリリースはおそらくの前に行う必要があります[super dealloc]

ただし、「クラス変数」の意味はよくわかりません。シングルトン内ではmpCurrentPieceColor、強力な(または保持された)プロパティとして使用し、でアクセスするとself.mpCurrentPieceColor、割り当てに関するリリース/保持がなくなります。(もちろん、ARCに切り替えると、問題全体が解消されます。)

もう1つのポイントは、[製品]-> [分析]メニューオプションで、この種の問題にフラグを立てることができるはずです。

于 2012-10-20T16:23:40.777 に答える
1

質問AとBは、正しいメソッド名を使用していないため、やや混乱を招きます。「get」はCocoaで特別な意味を持ち、めったに使用されません。名前に「randomColor」が必要な場合があります。自動解放されたオブジェクトを返す必要がありますが、colorWithRed:green:blue:alphaがそれを行うので、名前以外は問題なく表示されます。

自動解放されたオブジェクトを返す場合は、結果を保持し、終了したら解放する必要があります。

あなたのdeallocは間違いなく正しくありません。[superdealloc]はオブジェクトの破棄を終了します。その後、オブジェクトの一部(mpCurrentPieceColor)を使用することはできません。オブジェクトを破棄する最後のステップであるため、常に[superdealloc]を最後に呼び出す必要があります。

于 2012-10-20T16:24:02.320 に答える