2009-09-06 28 views
4

我正在为objective-c编写一个xml序列化类。
重点是给这个类一个类的类型和一个xml文件。 它应该返回一个带有数据的实例。反映时:应该设置属性还是直接设置值? (Objective-C)

我有它的工作,它确实有点 - 处理原语(+ nsstring),用户定义的类和nsarrays。不处理指针或C数组。
显然这很大程度上依赖于反思。

问题:当我设置某个类的实例的值时,是否应该检查名称是否存在正确的属性,或者是否可以使用简单反射来设置变量?

这是怎样的代码中,我使用至今:

id newClass = class_createInstance(NSClassFromString(elementName), sizeof(unsigned)); 
Ivar nameVar = class_getInstanceVariable([newClass class], "name"); 
if (nameVar != nil) 
    object_setIvar(newClass, nameVar, [NSString stringWithString:@"George"]); 

而且,这种类型的赋值后,我应该发布什么?

+0

为什么你不使用NSKeyedArchiver?或CoreData? – Kornel 2009-09-07 00:26:24

回答

6

呃...你通常不需要需要这么低的运行时间去做那些代码。以下是功能全面,并且不完全一样的东西:

id newObject = [[NSClassFromString(elementName) alloc] init]; 
@try { 
    [newObject setValue:@"George" forKey:@"name"]; 
@catch (NSException *e) { 
    if ([[e name] isEqualToString:NSUndefinedKeyException]) { 
    NSLog(@"%@ does not recognize the property \"name\"", elementName); 
    } 
} 

//... do stuff with newObject 
[newObject release]; 

如果你需要把其他的东西,比如花车或者整形或结构,你可以框它们变成一个NSValue(或子类),然后通过那些到setValue:forKey:。例如:

NSNumber * aFloat = [NSNumber numberWithFloat:42.0]; 
[newObject setValue:aFloat forKey:@"aFloatIvar"]; 

NSRect frame = NSMakeRect(0, 0, 42, 54); 
NSValue * aStruct = [NSValue valueWithBytes:&frame objcType:@encode(NSRect)]; 
[newObject setValue:aStruct forKey:@"aStructIvar"]; 
+0

这段代码的问题在于它对原始类型不起作用。有没有办法解决它? – 2009-09-07 07:00:02

+1

把你的基元放入一个NSValue对象(如NSValue或NSNumber),内部将自动取消它们。 – 2009-09-07 15:13:07

+0

NSValue想要“objCType:(const char *)type”。 如何获取类型? (假设没有class_getInstanceVariable) – 2009-09-07 21:18:37