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
Post a Comment