0

誰もが知っているように、setTitle はパラメーターとして渡された文字列を自動的に保持します。ボタンのキャプションを変更する必要がある場合、新しい文字列を設定する前に現在の (古い) 文字列を解放する必要があると思います。ドットを付ける最もエレガントな方法は何だろうか。

私のコード サンプルを参照してください (ここで、getPlayerHandFromGame メソッドは、setTitle が呼び出されたときに保持される自動解放された文字列を生成します)。

colourString = [pGame getPlayerHandFromGame:1 withColour:COLOUR_HEARTS];


// Split colourString into array of strings if not null.
    if ([colourString length] != 0) {
        listCards = [colourString componentsSeparatedByString:@" "];
        for (cardCounterSameColour = 1; cardCounterSameColour <= [listCards count]; cardCounterSameColour ++) {
            currentCardButton = [self buttonCardNumber:cardCounter];
            // Objects are numbered from 0 in the array
            [currentCardButton setTitle:[listCards objectAtIndex:cardCounterSameColour-1] forState:UIControlStateNormal];
            cardCounter ++;
        }
    }

ボタンのキャプションが数回更新されるため、コードのこの部分は数回呼び出されます。タイトルを設定する前に、次のようにする必要があると思います。

[currentCardButton titleForState:UIControlStateNormal release]

もう使用されない文字列を解放するため (titleForState は NSString へのポインターを返します)。

デバイスのメモリに未使用の文字列がロードされるのを避ける正しい方法ですか?

どうもありがとう、Apple92

4

3 に答える 3

6

プロパティの 1 つに設定された値を保持するクラスは、そのプロパティの値が再び変更されたときに古い値を解放する責任もあります。ご心配なく。

于 2010-06-29T18:37:08.937 に答える
2

誰もが知っているように、setTitle はパラメーターとして渡された文字列を自動的に保持します。

本当に?私はそれを知りません。実際、文字列を保持するのではなく、コピーすることに 1 パイントのビールを賭けます。

確かに、NSString の場合、-copy は保持を実行して自己を返すように実装されている可能性がありますが、NSMutableString を渡すと、本物のコピーが発生します。

新しい文字列を設定する前に、現在の (古い) 文字列を解放する必要があると思います。

もう一度推測してください、吸盤!

または、あまり面白くない: どのオブジェクトも、保持したい他のオブジェクトの所有権を管理する責任があります。setTitle でタイトルを渡した後は、オブジェクトが新しいタイトルを取得した後、オブジェクトがそれをどのように破棄するかについて心配する必要はありません。

次のコードを検討してください。

[currentCardButton titleForState:UIControlStateNormal]

返された結果にメモリ管理ルールを適用します。

alloc、new、copyで取得しましたか?いいえ、あなたはそれを保持しましたか?いいえ (最初に渡したオブジェクトではなく、メソッドによって返されたオブジェクトについて話していることを思い出してください)。したがって、リリースしてはいけません

于 2010-06-30T08:29:54.897 に答える
2

オブジェクト所有権の規則を見てみましょう。

http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmObjectOwnership.html#//apple_ref/doc/uid/20000043-BEHDEDDB

すべてのクラスはこれらのルールに従う必要があります (Apple のルールに従っています)。そのため、クラスで割り当て/保持を行っていないため心配する必要はありません。また、ボタンは内部使用のためにそれを保持します。

于 2010-06-29T23:46:36.720 に答える