A foreword: Understand that user defaults are not a general-purpose database. Unless the data you propose to store there is quite small, I strongly discourage you from doing this. An alternative is to store the data in a well-defined location, such as the Application Support directory.
EDIT
In the previous paragraph, I had stated that the Application Support directory should not be used for data that will change. I cannot find anything to support this. Apple's own documentation states that it is "where your app stores any type of file that supports the app but is not required for the app to run," that user data should not be stored there, and that each app should create and maintain its own directory inside it, rather than write to its top level. Not at all certain where I picked up this bit of fiction, and am sorry for having perpetuated it.
END EDIT
That being said, when the compiler complains of "non-property value(s)," that means that you're attempting to write something that is not a NSArray,
NSDictionary,
NSString,
NSData,
NSDate
or NSNumber.
You are correct that your own objects need to make use of NSKeyedArchiver and NSKeyedUnarchiver. But just because you're implementing your NSCoding
methods in your model object doesn't change the fact that it's not a property list value.
What you need to do is to use NSKeyedArchiver
before you attempt to store each of your objects. This produces an instance of NSData
that can be stored as a property list object.