[NSCFString stringValue]: непризнанный селектор, отправленный в экземпляр

Я использую этот код для запроса данных ядра и возврата значения ключа, я сохраняю значение следующим образом:

 NSString *newName= @"test"; 
 [newShot setValue:newName forKey:@"shotNumber"]; 

и я запрошу вот так:

NSManagedObject *mo = [items objectAtIndex:0];  // assuming that array is not empty
  NSString *value = [[mo valueForKey:@"shotNumber"] stringValue];
  NSLog(@"Value : %@",value);

Я сбой с этим сообщением:

[NSCFString stringValue]: непризнанный селектор, отправленный в экземпляр,

Кто-нибудь знает, откуда это будет?

Ответ 1

newName (@"test") уже является NSString. Нет необходимости вызывать -stringValue, чтобы преобразовать его в строку.

NSString *value = [mo valueForKey:@"shotNumber"];

Ответ 2

[mo valueForKey: @"shotNumber"] возвращает строку и NSString (из которых NSCFString является деталью реализации) не реализует метод stringValue.

Учитывая, что NSNumber реализует stringValue, я бы сказал, что вы помещаете NSString в mo, когда думаете, что ставили NSNumber.

Ответ 3

Значение для ключа @"shotNumber", вероятно, имеет тип NSString, который является только оболочкой для NSCFString. Что вам нужно сделать, вместо stringValue использовать метод description.

Ответ 4

Я часто добавляю категорию для NSString для этого:

@interface NSString(JB)
-(NSString *) stringValue;
@end

@implementation NSString(JB)
  -(NSString *) stringValue {
  return self;
}
@end

Вы можете добавить подобную категорию к другим классам, на которые вы хотите ответить таким образом.

Ответ 5

Обратите внимание, что вы также можете получить эту проблему, если пытаетесь получить доступ к строковому свойству объекта, который, по вашему мнению, является чем-то другим, но на самом деле является строкой.

В моем случае я думал, что мой объект Hydration был фактически гидратацией, но, проверяя его класс с помощью isKindOfClass, я обнаружил, что это был NSString, и понял, что я неправильно использовал его как объект Hydration и что моя проблема больше вверх по цепочке.