Ошибка: -[UIImage _deleteExternalReferenceFromPermanentLocation] нераспознанный селектор, отправленный экземпляру

#core-data #ios5 #transformable

#основные данные #ios5 #преобразуемый

Вопрос:

Когда я удаляю управляемый объект, содержащий изображение, сохраненное как преобразуемое значение во внешней записи, тогда я получил сбой и эту ошибку:

 Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIImage _deleteExternalReferenceFromPermanentLocation]: unrecognized selector sent to instance 0xde49360' 
 

Ответ №1:

Я ответил на что-то подобное на форумах разработчиков Apple.
Я предполагаю, что у вас установлен флажок внешнего хранилища в этом поле в средстве моделирования данных.

Существует ошибка, которую можно обойти. Я сделал это так:
после того, как вы обновили свои данные и сохранили контекст, любая попытка удалить его вызовет это исключение «нераспознанный селектор».
Чтобы принудительно создать правильный объект, который может ответить на сообщение _deleteExternalReferenceFromPermanentLocation, выполните следующее:

 [[self managedObjectContext] refreshObject:myobject mergeChanges:NO];
 

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

Комментарии:

1. Является ли это также проблемой для основного типа данных «Двоичные данные» (с установленным флажком «Разрешает внешнее хранилище») или только проблемой для «Трансформируемого»?

Ответ №2:

Означает, что UIImage не отвечает на:

 _deleteExternalReferenceFromPermanentLocation
 

… селектор, который означает, что UIImage не реализует этот конкретный метод. Похоже, это один из частных методов, который Core Data использует для хранения больших фрагментов данных во внешних файлах. Эта функция доступна только в iOS 5.

В этом случае есть две наиболее вероятные причины:

(1) Вы перепутали объект UIImage с управляемым объектом или наоборот, так что сообщение, предназначенное для одного класса, отправляется другому (это наиболее распространенная причина ошибок этого класса).

(2) Вы пытаетесь запустить код, скомпилированный для iOS 5 под более ранней версией iOS, либо в симуляторе, либо на устройстве.

Комментарии:

1. У меня есть преобразуемый атрибут, в котором я сохраняю UIImage через NSValueTransformer… Насколько я понимаю, мне нужно изменить этот атрибут на NSData, чтобы избежать этого сообщения об ошибке

Ответ №3:

Я тоже столкнулся с этой проблемой NSDate с атрибутом core data. Мне не нужно, чтобы он сохранялся извне, но не удалось найти ни одного флажка для снятия (Xcode 4.2). Тем не менее, это было явно там, когда я ack редактировал для этого:

 > ack -aiQ external Collections.xcdatamodeld
Collections.xcdatamodeld/Collections.xcdatamodel/contents
12:        <attribute name="createdAt" attributeType="Date" allowsExternalBinaryDataStorage="YES" indexed="YES" syncable="YES"/>
 

Поэтому я просто удалил и заново создал этот атрибут с тем же именем. Атрибут allowsExternalBinaryDataStorage XML исчез, как и мой сбой. Должно быть, я случайно что-то проверил во время бета-версии iOS 5 или чего-то в этом роде, и он просто застрял в модели данных, спокойно ожидая, пока я не попытаюсь удалить объект.

В любом случае, возможно, это поможет другим людям, которые сталкиваются с тем, что кажется ошибкой iOS, но не нуждаются в том, чтобы рассматриваемый атрибут сохранялся извне.