Комментарии 18
А если параметров много и не хочется каждый перебирать ручками, то кодирование/декодироание можно сделать так:
- (void)encodeWithCoder:(NSCoder *)encoder
{
unsignedint outCount, i;
objc_property_t *properties = class_copyPropertyList([selfclass], &outCount);
for (i = 0; i < outCount; i++)
{
objc_property_t property = properties[i];
NSString * name = [NSStringstringWithCString:property_getName(property) encoding:NSUTF8StringEncoding];
id value = [selfvalueForKey:name];
[encoder encodeObject:value forKey:name];
}
}
- (id)initWithCoder:(NSCoder *)decoder
{
if((self = [superinit]))
{
unsignedint outCount, i;
objc_property_t *properties = class_copyPropertyList([selfclass], &outCount);
for (i = 0; i < outCount; i++)
{
objc_property_t property = properties[i];
NSString * name = [NSStringstringWithCString:property_getName(property) encoding:NSUTF8StringEncoding];
id value = [decoder decodeObjectForKey:name];
[selfsetValue:value forKey:name];
}
}
return self;
}
0
В вашем варианте предполагается, что все свойства — объекты.
В статье описывается так же кодирование примитивных типов.
В статье описывается так же кодирование примитивных типов.
0
Можно лишнего насохранять много да и свойства не property упустить. Чем меньше лезешь в рантайм тем код менее зависим от его изменений. Я бы тогда уже посоветовал создавать у каждого класса статический метод, который хранит набор ключей для архивации:
+ (NSArray*)keysForArchiving
{
return [[super keysForArchiving] arrayByAddingObjectsFromArray:@[@"title", @"status", @"_privateIvar"]];
}
- (void)encodeWithCoder:(NSCoder *)encoder
{
for (NSString* key in [[self class] keysForArchiving])
[encoder encodeObject:[self valueForKey:key] forKey:key];
}
- (id)initWithCoder:(NSCoder *)decoder
{
self = [super init];
if(self)
{
for (NSString* key in [[self class] keysForArchiving])
[self setValue:[decoder decodeObjectForKey:key] forKey:key];
}
return self;
}
0
Нарушив тем самым SRP :)
0
Не силен в этом вопросе, но все же, как нарушает?
0
В этом случае выходит что объект (POD по сути) отвечает еще и за то какие данные он должен хранить.
Но я утрирую, конечно :)
Но я утрирую, конечно :)
0
В своем проекте применял NSCoding для хранения введенных в форму поиска данных, архивации настроек. Очень удобно.
0
На хабре странная тенденция просвещения темы iOS разработки — про самые тривиальные вещи пишут топики. Неужели тема, которая сводится к одной страничке документации и полностью прозрачна, достойна поста на хабре?
+1
Порой кажется, что iOS-разработка уже обсосана со всех сторон, и постить нечего.
Да и правда, зачем постить, если stackoverflow решит все проблемы
Да и правда, зачем постить, если stackoverflow решит все проблемы
0
Серьезно, за такими темами надо лезть на SO? Скоро туда уже за примерами if else бегать будут.
0
Я не говорил конкретно про эту тему.
Просто когда в гугле формулируешь вопрос, обычно вываливается SO, а потом только документация.
Просто когда в гугле формулируешь вопрос, обычно вываливается SO, а потом только документация.
0
Ок, сорри, не так понял. Вообще предпочитаю и сотрудникам рекомендую использовать следующий подход. Надо разобраться как работает технология (например архивация) идем в доку и там читаем все об архивации от А до Я, чтоб знания небыли поверхностными, а то часто лишнего сохраняют, а о encodeConditionalObject: никто даже не знает. Это касается любых других фреймворков/технологий.
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Сериализуем настройки при помощи протокола NSCoding