別の変数と比較する前に、変数に文字列を割り当てる必要がありますか?


85

の値をNSString文字列「Wrong」と比較したいと思います。これが私のコードです:

NSString *wrongTxt = [[NSString alloc] initWithFormat:@"Wrong"];
if( [statusString isEqualToString:wrongTxt] ){
     doSomething;
}

「間違った」のNSStringを本当に作成する必要がありますか?

また、ラベル値を文字列に割り当てずに、UILabel'sの値をtext文字列と比較できますか?


ちなみに、initWithFormatで時間を無駄にしているので、NSStringを変更できます* wrongTxt = [[NSString alloc] initWithFormat:@ "Wrong"]; NSStringへ* wrongTxt = @ "Wrong"; 他の入力から文字列を計算しようとする場合にのみ、initWithFormatを気にします。
クレイグ

回答:


178

「間違った」のNSStringを本当に作成する必要がありますか?

いいえ、なぜそうしないのですか?

if([statusString isEqualToString:@"Wrong"]){
    //doSomething;
}

を使用@""すると、有効な文字列リテラルが作成されますNSString

また、ラベル値を文字列に割り当てずに、UILabel.textの値を文字列と比較できますか?

はい、次のようなことができます。

UILabel *label = ...;
if([someString isEqualToString:label.text]) {
    // Do stuff here 
}

それはうまくいきます。私はバグのあるコードを持っていると思います。以前は例外をスローしていました。
ブライアン

1
詳述すると:label.textはISの文字列なので、もちろんあなたは、比較のために、それから文字列を作成する必要はありません。
アマグラマー2009


8

ブライアン、ここに入れる価値もあります-他の人はもちろん正しいので、文字列変数を宣言する必要はありません。ただし、次に文字列を宣言するときは、次のことを行う必要はありません。

NSString *myString = [[NSString alloc] initWithFormat:@"SomeText"];

上記は機能しますが、保持されたNSString変数を提供します。この変数は、使用終了後に明示的に解放する必要があります。

次に文字列変数が必要な場合は、「@」記号をはるかに便利な方法で使用できます。

NSString *myString = @"SomeText";

これは、使い終わると自動解放されるので、メモリリークも回避できます...

お役に立てば幸いです。


私はそれについて疑問に思っていました。Objective cオブジェクトである文字列変数をよく目にしますが、リリースされることはありません。ありがとう!
ブライアン

2
ヒントは「alloc」ビットにあります。Alloc(またはCopy)を使用する場合は、具体的にリリースする必要があります。そうしない場合、慣例では、オブジェクトはすでに自動解放に設定されています。
h4xxr 2009

はい、それが含有することができるものの、new又はcopy例えばnewObject(からNSDictionaryController)またはmutableCopy(からNSObjectdeveloper.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/...
アレックスRozanski

2

また、自動解放されたインスタンスを作成し、文字列の書式設定などのオプションを追加するNSStringクラスメソッドを使用することもできます。

NSString *myString = [NSString stringWithString:@"abc"];
NSString *myString = [NSString stringWithFormat:@"abc %d efg", 42];
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.