Причина, по которой ==
работает, заключается в сравнении указателей. Когда вы определяете константу NSString
using @""
, компилятор унифицирует ссылку. Когда одни и те же константы определены в других местах вашего кода, все они будут указывать на одно и то же фактическое место в памяти.
При сравнении 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