Это неправильный подход к проблеме. Сообщение в блоге, на которое вы ссылаетесь, сохраняет расширенные атрибуты в виде сериализованного списка. Список может содержать только следующие типы объектов, как написано в официальном документе :
NSArray
, NSDictionary
, NSDate
, NSData
, NSString
и NSNumber
.
Другие занятия просто запрещены. Не добавляйте объекты любого другого класса в атрибуты, расширенные таким образом.
Кроме того, сохранение файла изображения в базе данных CoreData не является хорошей идеей, вообще говоря, прочитайте О BLOB-объектах в официальном документе. Вместо этого сохраните UIImage
в файле и запишите путь к файлу в базе данных CoreData.
Если у вас просто есть временное свойство, которое не сохраняется в базе данных, вам даже не придется создавать расширенные атрибуты. Просто добавьте его как свойство подкласса NSManagedObject
:
@interface MyManagedObject: NSManagedObject {
}
@property(retain, nonatomic) UIImage* thumbnail;
@property(retain, nonatomic) NSDictionary* thumbnailDictionary;
@end
без добавления thumbnail
в модели CoreData. Затем выполните соответствующий @synthesize
в файле .m
. Свойство, добавленное таким образом к управляемому объекту, просто не сохраняется.
Если вы хотите сохранить неизвестное количество миниатюр, вы можете поместить NSDictionary
(или NSArray
), содержащий UIImage*
s.
Если вы действительно хотите получить CFType
от NSObject*
, сделайте следующее:
NSObject* x= ...;
CFTypeID typeID=CFGetTypeID((CFTypeRef)x);
if(typeID != CFStringGetTypeID() &&
typeID != CFDateGetTypeID() &&
typeID != CFDataGetTypeID() &&
typeID != CFDictionaryGetTypeID() &&
typeID != CFArrayGetTypeID() ) {
... it's a non-plistable type ...
}
Уродливое предложение if
существует потому, что нет общедоступной функции, которая дает вам CFTypeID
объекта Objective-C без мостов.
Прочитайте ссылку CFType . Но я не рекомендую делать это.