Objective C对象序列化通用的NSCoder成员方法
/* NSCoder functions taken from:
* http://davedelong.com/blog/2009/04/13/aspect-oriented-programming-objective-c
*/
- (id) initWithCoder:(NSCoder *)decoder {
if ([super respondsToSelector:@selector(initWithCoder:)] && ![self isKindOfClass:[super class]]) {
self = [super performSelector:@selector(initWithCoder:) withObject:decoder];
} else {
self = [super init];
}
if (self == nil) { return nil; }
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
unsigned int numIvars = 0;
Ivar *ivars = class_copyIvarList([self class], &numIvars);
for(int i = 0; i < numIvars; i++) {
Ivar thisIvar = ivars[i];
NSString *key = [NSString stringWithUTF8String:ivar_getName(thisIvar)];
id value = [decoder decodeObjectForKey:key];
if (value == nil) { value = [NSNumber numberWithFloat:0.0]; }
[self setValue:value forKey:key];
}
if (numIvars > 0) { free(ivars); }
[pool drain];
return self;
}
- (void) encodeWithCoder:(NSCoder *)encoder {
if ([super respondsToSelector:@selector(encodeWithCoder:)] && ![self isKindOfClass:[super class]]) {
[super performSelector:@selector(encodeWithCoder:) withObject:encoder];
}
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
unsigned int numIvars = 0;
Ivar *ivars = class_copyIvarList([self class], &numIvars);
for (int i = 0; i < numIvars; i++) {
Ivar thisIvar = ivars[i];
NSString *key = [NSString stringWithUTF8String:ivar_getName(thisIvar)];
id value = [self valueForKey:key];
[encoder encodeObject:value forKey:key];
}
if (numIvars > 0) { free(ivars); }
[pool drain];
}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。