Основные данные: настройка Entity.Attribute, Type Issues - PullRequest
2 голосов
/ 02 августа 2011

Я сейчас пытаюсь настроить свою сущность, заполнив необходимые атрибуты.Я делаю это, анализируя XML-ответ и назначая атрибуты по мере их появления.Проблема, с которой я сталкиваюсь, заключается в том, что у меня возникает несоответствие типов, которое приводит к тому, что моя функция набора атрибутов выдает ошибку «неверный селектор отправлен в функцию».Я вошел в отладчик и заметил, что всегда перед присвоением моего атрибута custEntity.name мой тип, кажется, был NSCFString вместо NSString.Я провел некоторые поиски, а также несколько тестов и собственных попыток исправлений, но не смог никуда добраться.Вот некоторый соответствующий код и его эффекты.

Автоматически сгенерирован и объединен в один файл с другим определением моей сущности, DataModelObject.h:

@interface Checkpoint : NSManagedObject {
    @private
}
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSNumber * lat;
@property (nonatomic, retain) NSNumber * lon;
@property (nonatomic, retain) NSManagedObject * myRoute;
@end

DataModelObject.m

@implementation Checkpoint
@dynamic name;
@dynamic lat;
@dynamic lon;
@dynamic myRoute;
@end

Как мой текущий код выглядит в результате предложения кому-то еще с чем-то похожим в другом месте:

NSString *chkptName = [attributeDict objectForKey:@"name"];
checkpoint.name = [[NSString stringWithString:chkptName] stringValue];

Это кажется мне серьезным излишним, хотя я новичок в Objective-c и разработка iPhone, так что я не знаю, это может быть необходимо, в любом случае это не работает.Перед выполнением второй строки значение chkptName является правильной, удобочитаемой строкой, которую я хотел бы назначить.Теоретически, если я правильно понимаю вторую строку, я просто повторно объявляю строку NSString со значением ckptName и снова считываю ее фактическое значение с помощью stringValue, которое должно совпадать с получением значения chkptName.Однако во второй строке мое приложение аварийно завершает работу с sigAbrt, и когда я пытаюсь проверить значения моей переменной, оно показывает, что оно имеет тип NSCFString с недопустимой сводкой для значения.На данный момент я не знаю, как это исправить.Я правильно изменил атрибуты сущностей и раньше и не сталкивался с этой проблемой раньше.

Вероятно, стоит также отметить, что я начал это гораздо проще:

checkpoint.name = [attributeDict objectForKey:@"name"];

Но это привело к тому жеsigAbrt и ошибка неверного селектора.

Редактировать: Полная ошибка в соответствии с запросом:

2011-08-02 07: 25: 00.544 MyApp [16011: 207] - [NSCFString stringValue]: нераспознанный селектор отправлен в экземпляр 0x5c174e0 2011-08-02 07: 25: 00.545 MyApp [16011: 207] * Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: '- [NSCFString stringValue]: нераспознанный селектор, отправленный экземпляру 0x5c174e0'

Edit2: Вывод отладчика:

(gdb) po checkpoint
<Checkpoint: 0x5a30730> (entity: (null); id: (null) ; data: {})
(gdb) po [checkpoint class]
Checkpoint
(gdb) po [checkpoint entity]
Can't print the description of a NIL object.

Любое разъяснение, которое вы можете предоставить, будет высоко ценится, если есть какой-то соответствующий код, который я пропустил, пожалуйста, спросите, и я буду рад предоставить его, если это возможно.Спасибо!

-Каролы

Ответы [ 2 ]

1 голос
/ 02 августа 2011

Так что кажется, что на вопрос уже дан ответ, но, возможно, для дальнейшего использования:

Если вы получаете сообщение об ошибке, подобное этому:

2011-08-02 07:25:00.544 MyApp[16011:207] -[NSCFString stringValue]: unrecognized selector sent to instance

Довольно полезно по-настоящему взглянуть на то, что говорится:

unrecognized selector sent to instance означает, что объект получил сообщение, на которое он не может ответить или не знает как.

-[NSCFString stringValue] показывает, какое сообщение было отправлено (stringValue) и какому объекту оно было отправлено (NSCFString).

Из сообщения об ошибке мы видим, что ошибка, скорее всего, произошла, когда вы позвонили

checkpoint.name = [[NSString stringWithString:chkptName] stringValue];

Поскольку это, кажется, единственное место, где вы вызываете сообщение stringValue на объекте (из того, что вы опубликовали). И NSCFString это просто подкласс NSString.

Так что вы не можете звонить stringValue на NSString (что тоже имеет смысл). Просто для пояснения, но, как я прочитал, проблема уже решена. :)

1 голос
/ 02 августа 2011

Я думаю, вам следует внимательно посмотреть и убедиться, что ваша переменная checkpoint действительно является экземпляром класса Checkpoint.

  1. Убедитесь, что класс правильно настроен в ваших базовых данных.модель.
  2. Установите точку останова во время выполнения и напечатайте объект в отладчике: po checkpoint.
  3. Проверьте сущность объекта во время выполнения с помощью: po [checkpoint entity].
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...