0

一時的にいくつかの文字列を使用する必要がある状況がありますが、競合するものを非常に多く読んだため、続行する最善の方法について少し混乱しています。

if 構造内にいくつかの文字列を割り当てる必要がありますが、if 構造の外でそれらを使用するため、if の外で作成する必要があります。次のようなことを考えていました。

NSString *arbString = [[NSString alloc] init];

if(whatever)
{
    arbString = @"Whatever"
}
else
{
    arbString = @"SomethingElse"
}

myLabel.text = arbString;
[arbString release];

人々がちょうど使用した例を見てきました:

NSString *arbString;

文字列変数を作成する

Google の Objective C ガイドでは、作成時に自動解放することをお勧めします。

「新しい一時オブジェクトを作成するときは、後で同じ方法で個別にリリースするのではなく、作成したのと同じ行でそれらを自動リリースします」:

// AVOID (unless you have a compelling performance reason)
MyController* controller = [[MyController alloc] init];
// ... code here that might return ...
[controller release];

// BETTER
MyController* controller = [[[MyController alloc] init] autorelease];

だから私にはわかりませんが、どれがベストプラクティスですか?

4

1 に答える 1

1

投稿した例では、で割り当てたときに作成したNSStringへの参照が実際に失われますarbString = @"Whatever"。次に、文字列定数を解放します(ちなみに、これは解放できません)。

したがって、作成したNSStringを解放することはないため、メモリリークが発生します。

これらのタイプはすべてポインタであるため=、再割り当てするだけであることに注意してください。

質問に関しては、この例では、は必要ありません[[NSString alloc] init]。とにかく文字列をローカル変数にコピーする必要はありません。myLabel.text文字列定数に設定するだけ@"Whatever"です。

(編集:それはあなたがあなたのポインタを使うことができないということではありませんarbStringarbString = @"Whatever"; myLabel.text = arbString大丈夫です。しかしこれは単なるポインタの割り当てであり、コピーではありません)

文字列を返す前に文字列を操作する必要がある場合は、NSMutableStringを作成し、それを解放または自動解放します。個人的には、クラスメソッドを使用して自動解放されたオブジェクトを作成するため、この例では、自動解放されたオブジェクトを返す、、[NSString string]またはを使用します。[NSString stringWithString:]

于 2010-07-05T10:37:17.390 に答える