Можно создать дубликат:
Understanding NSString comparison in Objective-CПочему NSString иногда работает с знаком равенства?
просто читал до о равенстве против личности, и я понял, что я использовал некоторые одинаковые знаки при сравнении строк в моем ObjC коде. Странно то, что он действительно работает от времени до времени, и мне было интересно, почему.
http://www.karlkraft.com/index.php/2008/01/07/equality-vs-identity/
У меня есть два фрагмента кода, одну работу и один не делает.
РАБОТА. Здесь у меня есть объект под названием «Категория», который имеет свойство NSString, называемое «имя».
@property (nonatomic, retain) NSString *name;
Я тогда функция, где я прохожу в указателе марки «КАТЕГОРИИ» и, когда я использую знак равенства здесь, он прекрасно работает.
-(void)addCategoryToStorage:(Category*)newcategory {
if(newcategory.name != @"All") { // this works
НЕ РАБОТАЕТ. Здесь я использую вывод вызова 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» указано «(__NSCFConstantString *) и имеет значение видимое. По какой-то причине массивы «dirContent» содержат два объекта (__NSString *), где значения не видны.
Возникает другой вопрос. Что делает NSString в первом случае стать константой? Кажется, что-то связано с тем, как он создается, когда я передаю его функции. Когда я выделяю новый объект с свойством NSString, который затем передаю функции, функция видит его константой (свойство NSString объекта). Но когда объект хранится в списке, и я его захватываю, передавая [array objectAtIndex: index] в функцию, функции не получают его как константу (свойство NSString объекта).
Спасибо!
Технический термин: * string interning *. –
Итак, компилятор не будет иметь никакого значения между [NSString stringWithString: @ "All"] и @ "All"? – chikuba
А как насчет того, как компилятор делает строку в константе в некоторых случаях? У меня есть две функции, где я предоставляю ему указатель категории, а иногда NSString является константой. – chikuba