Я хочу иметь возможность взять объект и записать все его свойства в PLIST. Я дошел до этого:
// Get the properties of the parent class
NSMutableArray *contentViewPropertyNames = [self propertyNamesOfObject:[contentView superclass]];
// Add the properties of the content view class
[contentViewPropertyNames addObjectsFromArray:[self propertyNamesOfObject:contentView]];
// Get the values of the keys for both the parent class and the class itself
NSDictionary *keyValuesOfProperties = [contentView dictionaryWithValuesForKeys:contentViewPropertyNames];
// Write the dictionary to a PLIST
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *pathAndFileName = [documentsDirectory stringByAppendingPathComponent:[dataFileName stringByAppendingString:@".plist"]];
[keyValuesOfProperties writeToFile:pathAndFileName atomically:YES];
Все хорошо, за исключением того, что я не могу записать это в PLIST, потому что он содержит некоторые свойства, несовместимые с PLIST, поэтому writeToFile:atomically:
терпит неудачу и возвращает NO
.
Есть ли хороший способ сериализовать только те свойства, которые можно преобразовать в PLIST, или изменить базовый класс моих объектов, чтобы это работало?
Я понимаю, что могу архивировать в двоичный файл без проблем с NSCoding
, однако мне нужно иметь возможность передавать выходные данные между приложением MacOS и приложением iOS, поэтому мне нужно использовать промежуточный, независимый от платформы формат.
Конечно, я мог полностью упустить суть, если у меня есть, пожалуйста, скажите, и, как всегда, любая помощь полезна.
С наилучшими пожеланиями
Дэйв
P.S.
Вот мой метод получения имен свойств объекта:
- (NSMutableArray *)propertyNamesOfObject:(id)object {
NSMutableArray *propertyNames = nil;
unsigned int count, i;
objc_property_t *properties = class_copyPropertyList([object class], &count);
if (count > 0) {
propertyNames = [[[NSMutableArray alloc] init] autorelease];
for(i = 0; i < count; i++) {
objc_property_t property = properties[i];
const char *propName = property_getName(property);
if(propName) {
NSString *propertyName = [NSString stringWithCString:propName encoding:NSUTF8StringEncoding];
[propertyNames addObject:propertyName];
}
}
}
free(properties);
return propertyNames;
}