Карл прав, но есть некоторая тонкость, о которой нужно помнить. Учтите это:
NSString *s1 = @"string1";
NSString *s2 = [[NSString alloc] initWithString:@"string1"];
NSString *s3 = [NSString stringWithString:@"string1"];
NSString *s4 = [NSString stringWithFormat:@"string1"];
NSLog(@"ptrs %p %p %p %p", s1, s2, s3, s4);
Вывод:
ptrs 0x1000010c0 0x1000010c0 0x1000010c0 0x100108da0
Это верно; s1
, s2
и s3
все указывают на один и тот же экземпляр строки, в то время как s4
оказывается новым экземпляром. Это связано с тем, что NSString
определяет, когда строка инициализируется из константной строки, и, когда это абсолютно допустимо, возвращает константную строку вместо того, чтобы пытаться выделить новый фрагмент памяти для хранения того же самого объекта. stringWithFormat:
случай не так оптимизированы, вероятно, потому, что весь потенциал обработки строк формата делает такой оптимизации и спорный вопрос и, скорее всего, неестественным реализации.
Другими словами, не предполагает, что две строки одинаковы или различны только при проверке кода или при сравнении указателя. Используйте isEqual:
или, еще лучше, isEqualToString:
.