title: Why is NSUserDefaults unwilling to save my NSDictionary?
body: <p>I'm using KVC to serialize an <code>NSObject</code> and attempt to save it to <code>NSUserDefaults</code>, which is giving me an <code>Attempt to insert non-property value</code> when I try to store my <code>NSDictionary</code>.</p>
  
  <p>Following are the properties of the object in question, <code>MyClass</code>:</p>
  
  <pre><code>@interface MyClass : NSObject
  @property (copy,nonatomic) NSNumber* value1;
  @property (copy,nonatomic) NSNumber* value2;
  @property (copy,nonatomic) NSString* value3;
  @property (copy,nonatomic) NSString* value4;
  @property (copy,nonatomic) NSString* value5;
  @property (copy,nonatomic) NSString* value6;
  @property (copy,nonatomic) NSString* value7;
  @property (copy,nonatomic) NSString* value8;
  @end
  </code></pre>
  
  <p>When it is time to save MyClass it occurs here:</p>
  
  <pre><code>-(void)saveMyClass
  {
    NSArray* keys = [NSArray arrayWithObjects:
                  @"value1",
                  @"value2",
                  @"value3",
                  @"value4",
                  @"value5",
                  @"value6",
                  @"value7",
                  @"value8",
                  nil];
    NSDictionary* dict = [self dictionaryWithValuesForKeys:keys];
    for( id key in [dict allKeys] )
    {
      NSLog(@"%@ %@",[key class],[[dict objectForKey:key] class]);
    }
    NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:dict forKey:[NSString stringWithString:kMyClassKey]];
    [defaults synchronize];
  }
  </code></pre>
  
  <p>which produces this output:</p>
  
  <pre><code>2012-02-23 19:35:27.518 MyApp[10230:40b] __NSCFConstantString __NSCFNumber
  2012-02-23 19:35:27.519 MyApp[10230:40b] __NSCFConstantString __NSCFNumber
  2012-02-23 19:35:27.519 MyApp[10230:40b] __NSCFConstantString __NSCFString
  2012-02-23 19:35:27.519 MyApp[10230:40b] __NSCFConstantString __NSCFString
  2012-02-23 19:35:27.520 MyApp[10230:40b] __NSCFConstantString __NSCFString
  2012-02-23 19:35:27.520 MyApp[10230:40b] __NSCFConstantString __NSCFString
  2012-02-23 19:35:27.520 MyApp[10230:40b] __NSCFConstantString __NSCFString
  2012-02-23 19:35:27.520 MyApp[10230:40b] __NSCFConstantString NSNull
  2012-02-23 18:38:48.489 MyApp[9709:40b] *** -[NSUserDefaults setObject:forKey:]: Attempt to insert non-property value '{
      value1 = "http://www.google.com";
      value2 = "MyClassData";
      value3 = 8;
      value4 = "&lt;null&gt;";
      value5 = "http://www.google.com";
      value6 = 1;
      value7 = "http://www.google.com";
      value8 = 4SY8KcTSGeKuKs7s;
  }' of class '__NSCFDictionary'.  Note that dictionaries and arrays in property lists must also contain only property values.`
  </code></pre>
  
  <p>As you can see, all of the objects in the <code>dict</code> are property list values and all of its keys are <code>NSString*</code>.  What trivia am I lacking in order to execute this?  Or should I give up and use <code>writeToFile</code> or similar?</p>