1

「First」の値を持つ、、がありますNSStringfirstWordこれは次のように定義されました。

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

firstWord = [textView text];

ただし、その値を確認しようとすると、次のようになります。

if (firstWord == @"First"){}

比較はtrueを返さないか、Objective-CでYESと推測します。私はそれが文字列と同じ値を持っていることを知っています。したがって、このことから、文字列自体の値が同じであっても、ここでは同じではないポインタを比較していることが問題であると確信しています。では、どうすれば文字列自体を直接比較できますか?または、もっと効率的に、2つの文字列オブジェクト同じポインタを持っていることを確認してください。そうすれば、比較的コストのかかる文字列比較を行う必要がなくなりますか?

4

3 に答える 3

2

では、どうすれば文字列自体を直接比較できますか?

Cocoaでの文字列比較は。で行われisEqualToString:ます。

または、もっと効率的に、2つの文字列オブジェクトが同じポインタを持っていることを確認してください。

これは不可能です。1つは文字列リテラルで、アプリのバイナリのDATAセクションに格納されます。もう1つは、アプリのヒープ上にあります。特定の状況(を使用して文字列を作成するinitWithString:@"literal string")では、同じアドレスになりますが、それに依存するべきではありません。

余談ですが、テキストビューのテキストをポインタに割り当てる前に、文字列を割り当てる必要はありません。実際、リークを作成しているため、そうすべきではありません。

于 2012-07-09T06:28:06.717 に答える
0

実際には2つのエラーがあります。

あなたの実際の質問:

if (firstWord == @"First"){}

する必要があります

if ([firstword compare:@"first"]==NSOrderedSame) ...

最初の単語がnilでない場合にのみ機能します。

加えて:

NSString *firstWord = [[NSString alloc] init];
firstWord = [textView text];

これによりメモリが失われます。テキストビューを文字列に「コピー」していないため(変更できないため、とにかく可能ではありません)、単に別の文字列オブジェクトをポインタに割り当てているだけです。したがって、割り当てた空の文字列は失われます。

ただやる

NSString *firstWord;
firstWord = [textView text];

編集:文字列オブジェクトのテーブルを保持し、そこにあるすべての文字列を検索して、ポインタを「一意の」ポインタに置き換えるか、新しい文字列を追加する必要があるため、文字列に同じポインタがあることを確認すると、さらにコストがかかりますテーブルに...

于 2012-07-09T06:27:23.730 に答える
-1

SwiftからObjective-Cの学習を開始します。これが、deviceModelタイプごとに異なるレイアウトコードを与えるために私が行うことです。

    @property (nonatomic, strong) NSString *deviceModel;

    NSString *iPhoneSE = @"iPhone8,4";
    if ([self.deviceModel isEqualToString:iPhoneSE]) { // iPhone SE
        // layout code
    }
于 2021-09-04T06:29:37.877 に答える