Причина, по якій ==
працює, полягає в порівнянні покажчиків. Коли ви визначаєте константу NSString
за допомогою @""
, компілятор уніфікує посилання. Коли однакові константи визначені в інших місцях вашого коду, всі вони вказуватимуть на те саме фактичне місце в пам'яті.
Порівнюючи NSString
екземпляри, слід використовувати isEqualToString:
метод:
NSString *myString1 = @"foo";
NSString *myString2 = @"foo";
NSString *myString3 = [[NSString alloc] initWithString:@"foo"];
NSLog(@"%d", (myString2 == myString3))
NSLog(@"%d", (myString1 == myString2));
NSLog(@"%d", [myString1 isEqualToString:myString2]);
NSLog(@"%d", [myString1 isEqualToString:myString3]);
[myString3 release];
Редагувати:
NSString *myString3 = [[NSString alloc] initWithString:@"foo"];
// this is same with @"foo"
initWithString:
більше не створює нове посилання, вам знадобиться initWithFormat
,
NSString *myString3 = [[NSString alloc] initWithFormat:@"foo"];
myString3
вказівник на константу"foo"
як оптимізацію, тому загалом усі три ці змінні вказуватимуть на одне і те ж розташування пам'яті. Це справедливо як для gcc, так і для clang (із параметрами за замовчуванням). Спробуйте скласти це: gist.github.com/578568