title: Write custom object to .plist in Cocoa
body: <p>I am blocking into something and I am sure it is too big. 
  I have a custom object that look like this</p>
  
  <pre><code> @interface DownloadObject : NSObject &lt;NSCoding&gt;{
      NSNumber *key; 
      NSString *name; 
      NSNumber *progress; 
      NSNumber *progressBytes; 
      NSNumber *size; 
      NSString *path; 
  }
  @property (copy) NSNumber *key; 
  @property (copy) NSString *name; 
  @property (copy) NSNumber *progress; 
  @property (copy) NSNumber *size; 
  @property (copy) NSString *path; 
  @property (copy) NSNumber *progressBytes; 
  -(id)initWithKey:(NSNumber *)k name:(NSString *)n progress:(NSNumber *)pro size:(NSNumber *)s path:(NSString *)p progressBytes:(NSNumber *)pb; 
  @end
  </code></pre>
  
  <p>And the implementation</p>
  
  <pre><code>  @implementation DownloadObject
  @synthesize size, progress, name, key, path, progressBytes;
  
  -(id)initWithKey:(NSNumber *)k name:(NSString *)n progress:(NSNumber *)pro size:(NSNumber *)s path:(NSString *)p progressBytes:(NSNumber *)pb  
  {
      self.key = k;
      self.name = n; 
      self.progress = pro; 
      self.size = s; 
      self.path = p; 
      self.progressBytes = pb; 
  
      return self; 
  }
  
  -(id) initWithCoder: (NSCoder*) coder {
      if (self = [super init]) {
          self.key = [[coder decodeObjectForKey:@"Key"] retain];
          self.name = [[coder decodeObjectForKey:@"Name"] retain];
          self.progress = [[coder decodeObjectForKey:@"Progress"] retain];
          self.size = [[coder decodeObjectForKey:@"Size"] retain];
          self.path = [[coder decodeObjectForKey:@"Path"] retain];
          self.progressBytes = [[coder decodeObjectForKey:@"ProgressBytes"]retain]; 
      }
      return self;
  }
  
  
  -(void) encodeWithCoder: (NSCoder*) coder {
      [coder encodeObject:self.key forKey:@"Key"]; 
      [coder encodeObject:self.name forKey:@"Name"]; 
      [coder encodeObject:self.progress forKey:@"Progress"]; 
      [coder encodeObject:self.size forKey:@"Size"]; 
      [coder encodeObject:self.path forKey:@"Path"]; 
      [coder encodeObject:self.progressBytes forKey:@"ProgressBytes"]; 
  }
  
  
  -(void)dealloc
  {
      [key release]; 
      [name release]; 
      [size release]; 
      [progress release]; 
      [path release]; 
      [progressBytes release]; 
      [super dealloc]; 
  }
  
  @end
  </code></pre>
  
  <p>As you can see it implement NSCoding (I think so, NSObject does not conform to NSCoding). Now when I try to do something like that just to test</p>
  
  <pre><code>downloadArray = [[[NSMutableArray alloc]init]retain];
  NSNumber *number = [NSNumber numberWithInt:10]; 
  DownloadObject *object = [[DownloadObject alloc]initWithKey:number name:@"hey" progress:number size:number path:@"hey" progressBytes:number]; 
  [downloadArray addObject:object]; 
  [object release]; 
  [downloadArray writeToFile:path atomically:YES]; 
  </code></pre>
  
  <p><code>downloadArray</code> is a <code>NSMutableArray</code>. My plist read/write is fine, the <code>path</code> is located in the application support and when I log it show the plist path. </p>
  
  <p>But it just does not write the array to the plist, any idea ? </p>