Я считаю реализацию encodeWithCoder и initWithCoder довольно скучной, особенно если у вас много атрибутов в вашем классе и много классов для сохранения в NSUserDefaults.
Я создаю библиотеку RMMapper (https://github.com/roomorama/RMMapper), чтобы помочьпроще и удобнее сохранять пользовательский объект в NSUserDefaults.
Чтобы пометить класс как архивируемый, просто используйте: #import "NSObject+RMArchivable.h"
Чтобы сохранить пользовательский объект в NSUserDefaults:
#import "NSUserDefaults+RMSaveCustomObject.h"
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
[defaults rm_setCustomObject:user forKey:@"SAVED_DATA"];
Чтобы получить пользовательский объект из NSUserDefaults:
user = [defaults rm_customObjectForKey:@"SAVED_DATA"];