Цель C две равные строки не оцениваются как равные, даже если байты одинаковы

У меня есть строка product:

NSString* product = models[[[peripheral identifier] UUIDString]];

и в отладчике я могу напечатать:

po product
>>> X3

и я могу проверить байты:

po [product dataUsingEncoding:NSUTF8StringEncoding]
>>> <5833>

Я также могу проверить байты буквальной строки @"X3":

po [@"X3" dataUsingEncoding:NSUTF8StringEncoding]
>>> <5833>

И я получаю тот же результат. Однако, когда я пытаюсь сделать:

[product isEqualToString:@"X3"]
>>> <nil>

Я получаю nil. Какого черта!? Я могу понять, когда есть скрытый символ или что-то в этом роде, но когда байты оцениваются как одно и то же, я сбит с толку.

Я даже могу:

NSData *d = [product dataUsingEncoding:NSUTF8StringEncoding];
NSData *d2 = [@"X3" dataUsingEncoding:NSUTF8StringEncoding];
po [d isEqualToData:d2]
>>> YES

person Chase Roberts    schedule 04.04.2019    source источник
comment
Что вы получите, если будете использовать NSUTF16StringEncoding вместо NSUTF8StringEncoding? Мне интересно, есть ли спецификация.   -  person Ken Thomases    schedule 04.04.2019
comment
Интересно. На самом деле вы должны получить bool, а не nil developer.apple. com/documentation/foundation/nsstring/   -  person Sergio Flores    schedule 04.04.2019
comment
Логический вывод состоит в том, что литерал @X3 внутренне представлен способом, отличным от продукта NSString. Таким образом, код работает, когда вы указываете кодировку, и не работает в противном случае при использовании значения по умолчанию.   -  person Sergio Flores    schedule 04.04.2019
comment
Должна быть настройка по умолчанию в XCode где-то   -  person Sergio Flores    schedule 04.04.2019
comment
@SergioFlores Обычно использование po (объект печати), когда это логическое значение (примитивное значение), равное 0, (часто? Всегда?) интерпретируется как 0x0000 ... так что ноль. Это нормальное поведение в отладчике. Что касается вашей проблемы, я бы сказал, что UUIDString не использует UTF8, поэтому он может подумать, что они разные. См. это: stackoverflow.com/questions/28507991/ Но ясно , это странное поведение.   -  person Larme    schedule 09.04.2019
comment
Что произойдет, если вы сделаете наоборот: [NSUUID initWithUUIDString:@"X3"] isEqual:models[[peripheral identifier]]]?   -  person Larme    schedule 16.04.2019