objective c - Write custom object to .plist in Cocoa -


i blocking , sure big. have custom object this

 @interface downloadobject : nsobject <nscoding>{     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 

and implementation

  @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 

as can see implement nscoding (i think so, nsobject not conform nscoding). when try test

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];  

downloadarray nsmutablearray. plist read/write fine, path located in application support , when log show plist path.

but not write array plist, idea ?

property list files can store basic data types , cannot contain custom objects. need convert object nsdata object if want written plist. can nskeyedarchiver, encode object conforms nscoding protocol nsdata object.

downloadobject *object = [[downloadobject alloc]initwithkey:number name:@"hey" progress:number size:number path:@"hey" progressbytes:number]; nsdata* objdata = [nskeyedarchiver archiveddatawithrootobject:object]; [downloadarray addobject:objdata]; [object release]; 

when want reconstruct object nsdata object, use nskeyedunarchiver:

nsdata* objdata = [downloadarray objectatindex:0]; downloadobject* object = [nskeyedunarchiver unarchiveobjectwithdata:objdata]; 

you have several memory leaks in code. in -initwithcoder: method, should not using accessors set value of ivars, should set ivars directly, so:

key = [[coder decodeobjectforkey:@"key"] copy]; 

you calling -retain , using accessor specified copy, mean object has retain count of 2 , not released. in general should avoid using accessors in init methods.

also, in code allocate downloadarray object, calling -alloc , -retain on object, leave retaincount of 2. should re-read objective-c memory management guidelines.


Comments

Popular posts from this blog

c++ - Is it possible to compile a VST on linux? -

java - Output of Eclipse is rubbish -

jquery - Confused with JSON data and normal data in Django ajax request -