Как стать автором
Обновить

Комментарии 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;
}
В вашем варианте предполагается, что все свойства — объекты.
В статье описывается так же кодирование примитивных типов.
Этот вариант тоже можно обыграть, кода будет немного больше, но его придется написать только один раз.
Можно лишнего насохранять много да и свойства не 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;
}
Нарушив тем самым SRP :)
Не силен в этом вопросе, но все же, как нарушает?
В этом случае выходит что объект (POD по сути) отвечает еще и за то какие данные он должен хранить.

Но я утрирую, конечно :)
Думаю, что тогда и к протоколу его будет конформить неправильно.
Да, с некоторой натяжкой это тоже нарушение, IMHO.
В своем проекте применял NSCoding для хранения введенных в форму поиска данных, архивации настроек. Очень удобно.
На хабре странная тенденция просвещения темы iOS разработки — про самые тривиальные вещи пишут топики. Неужели тема, которая сводится к одной страничке документации и полностью прозрачна, достойна поста на хабре?
Порой кажется, что iOS-разработка уже обсосана со всех сторон, и постить нечего.
Да и правда, зачем постить, если stackoverflow решит все проблемы
Серьезно, за такими темами надо лезть на SO? Скоро туда уже за примерами if else бегать будут.
Я не говорил конкретно про эту тему.
Просто когда в гугле формулируешь вопрос, обычно вываливается SO, а потом только документация.
Ок, сорри, не так понял. Вообще предпочитаю и сотрудникам рекомендую использовать следующий подход. Надо разобраться как работает технология (например архивация) идем в доку и там читаем все об архивации от А до Я, чтоб знания небыли поверхностными, а то часто лишнего сохраняют, а о encodeConditionalObject: никто даже не знает. Это касается любых других фреймворков/технологий.
Актуальный материал на октябрь 2011, так-то
В общем согласен, но тогда эта технология была нова и она описана чуть шире чем приконформиться к протоколу и описать два метода.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий