可能性の重複:
Understanding NSString comparison in Objective-CNSStringが等号で動作するのはなぜですか?
はちょうどアイデンティティ対平等についてまで読んでいたと私は私にObjCコード内の文字列を比較するとき、私はいくつかの等号を使用してきたことに気づきました。奇妙なことは、それが実際に時々から機能することです、なぜ私は不思議に思っていました。
http://www.karlkraft.com/index.php/2008/01/07/equality-vs-identity/
私は、コードの2枚、1つの作業があり、一つはしません。
働く。ここで私は '名前'と呼ばれるNSStringプロパティを持つ 'カテゴリ'と呼ばれるオブジェクトを持っています。
@property (nonatomic, retain) NSString *name;
私は 'Catergory'ポインタを渡し、ここで等号を使用すると完全に機能します。
-(void)addCategoryToStorage:(Category*)newcategory {
if(newcategory.name != @"All") { // this works
NON WORKING。ここでは、NSFileManager呼び出しの出力を使用します。
NSArray *dirContent = [self.fileManager
contentsOfDirectoryAtPath:@"MyFiles"
error:nil];
私は、配列内のNSStringsの上で比較してみてください:
for(int i = 0; i < [dirContent count]; i++) {
if([dirContent objectAtIndex:i] == @"MyFile") // This will never be True
だから私の質問があり、これら二つのNSStringのポインタがとても違った仕事と理由がどうなりますか?私は "=="を使用すべきではないが、現時点では知っているが、なぜそれが時にはうまくいくのか不思議だ。
私はそれらのデバッグの違いに気づいた。最初のケースでは、 "newcategory"の "name"が(__NSCFConstantString *)と表示され、値を表示していました。 何らかの理由で、 "dirContent"配列に値が表示されない2つの(__NSString *)オブジェクトが含まれています。
これは別の疑問を提起します。最初のケースのNSStringを定数にするのは何ですか?私はそれを関数に渡すと、それがどのように作成されるかと何かがあるようです。関数に渡すNSStringプロパティを持つ新しいオブジェクトを割り当てると、関数はそれを定数(オブジェクトのNSStringプロパティ)とみなします。しかし、オブジェクトがリストに格納されているときに、[array objectAtIndex:index]を関数に渡すことで関数を取得しても、関数は定数(オブジェクトのNSStringプロパティ)として取得されません。
ありがとうございます!
技術用語は* string interning *です。 –
コンパイラは[NSString stringWithString:@ "All"]と@ "All"の間に違いはありませんか? – chikuba
コンパイラが文字列を定数にする場合はどうですか?私はCategoryポインタを提供する2つの関数を持っています。また、NSStringは定数であることもあります。 – chikuba