-1

重複の可能性:
Objective-Cの2つの文字列を比較します

私は2つのNSString間の同等性を比較しようとします...

1つ目は共有ユーザーのデフォルトに保存され、2つ目はNSTextFieldを介してユーザーが入力します...

ここに私のコードの少しがあります(Xcode 4.5.2 Mac OS 10.7)..。

1番目のAppDelegate.h:

@interface AppDelegate : NSObject <NSApplicationDelegate>{

    NSUserDefaults *administratifPref;

    ...

    IBOutlet NSTextField *champProtection;

    ...
}

...

- (IBAction)poursuivre:(id) sender;

...

@end

そしてここにAppDelegate.m:

- (IBAction)poursuivre:(id)sender {

if([champProtection stringValue] == [champProtection stringValue]){
    ...
    ...
    }

}

私の質問は:条件「if」が検証されないのはなぜですか?!

問題は発生せず、クラッシュも発生しません...

私は2つのNSLogを追加しました:

- (IBAction)poursuivre:(id)sender {


NSLog([champProtection stringValue]);
NSLog([administratifPref valueForKey:@"motdepasse"]);


if([champProtection stringValue] == [champProtection stringValue]){
    ...
    ...
    }

}

戻り値同じです:(

私が見つけた唯一の解決策はやっています:

- (IBAction)poursuivre:(id)sender {

BOOL result = [[champProtection stringValue] isEqualToString:[administratifPref valueForKey:@"motdepasse"]];
if(result == YES) {
    ...
    ...
    }

}

だから...誰かが私にこれらの2つのコーディング方法の違いを説明できますか?それはすっごく違うようです?(しかし、ココアはとてもシンプルだと言う人を信頼している私のような初心者にとっても、それは本当に同じように思えます^^)

4

4 に答える 4

2

isEqualToStringがメモリバッファの内容(つまり、文字列)を比較している間、==演算子はオブジェクトのポインタアドレスを比較しています(2つのオブジェクトがあるため、オブジェクトは異なります。各オブジェクトは独自のメモリスペースを割り当てているため、異なるポインタアドレスを持っています)。彼ら自身)

于 2012-12-17T18:33:45.300 に答える
2
[champProtection stringValue] == [champProtection stringValue]

ここでは、彼らの住所と比較しています。

[[champProtection stringValue] isEqualToString:[administratifPref valueForKey:@"motdepasse"]];

そして、それは実際の文字列の内容を比較しています。

于 2012-12-17T18:35:26.697 に答える
1

Objective-CはCの厳密なスーパーセットです。オブジェクトを不透明なポインターの後ろに配置することでオブジェクトを追加します—すべてのObjective-Cオブジェクト宣言(typedefは別として)のアスタリスクは、保持している実際のものがオブジェクトへのポインターであることを意味します。オブジェクト自体ではなく、メモリ内のアドレス。

2つのポインタで実行する==場合、「どちらもメモリ内の同じ場所を参照していますか?」と尋ねます。その場合、両方が同じオブジェクトを参照するため、他のプロパティの中でも、両方のポインタが同じ値の何かを参照します。

(またはそのより具体的な兄弟の1つ)を使用する場合isEqual:、「場所に関係なく、これら2つのオブジェクトの値は同じですか?」と尋ねます。これは意味的にはまったく異なります。

したがって、2つのことはまったく異なります。あなたの場合、必要な動作の説明は、後者を使用することを意味します。

于 2012-12-17T18:38:55.360 に答える
1

2つの文字列を比較するには、次のコードを使用する必要があります。

if([name1 isEqualToString:name2]){
    NSLog("These are the same name");
}

Appleのドキュメントとここで詳細を見ることができます==と等しいの違い

于 2012-12-17T18:40:29.523 に答える