有没有更好的方法来在Objective-C中序列化plist-y对象?

时间:2009-10-30 21:39:31

标签: iphone objective-c macos plist

我喜欢小型对象集合的plist序列化功能:它很简单,存储是XML等。但是我发现字典中的设置值很麻烦:

[myDict setObject:keepThis forKey:@"ivar"];

我更喜欢使用派生类的对象(甚至只是结构):

myObj.ivar = keepThis

...然后向集合发送消息以获取plist。可以限制用于此目的的类/结构,以便它们可以直接轻松地映射到plist原语;例如,myObj可以映射到NSDictionary,并且可以将一个要求放在ivars上,这样它们就是plist原语之一。

有人已为此建立了设施,还是应该自己动手?

5 个答案:

答案 0 :(得分:5)

我不确定这是你所说的,但Key Value Coding将会让你get a dictionary with values from an instance's data以及set instance data from a dictionary

还有一种方法ask an instance for a list of its attributes,但事实证明你必须自己编写一些代码来实现这一目标。 (但是,您可以使用runtime introspection来实现,如果您愿意的话。)编辑2011年1月2日: -[NSObject attributeKeys]不再出现在iOS文档中。我编辑了链接以指向Mac文档,但请注意,这可能只是该平台上的一个选项。

NSCoding协议是另一种让你的对象自己存储/恢复的方法,但是存储是二进制的,而不是XML,你仍然有责任获取/放置你关注的每个值。系统这样做。)

答案 1 :(得分:3)

您可能需要查看this SO question,其中讨论了在运行时将实例的ivars放入字典中。

答案 2 :(得分:2)

一个有趣的项目。 Objective-C 2.0 Programming Guide有一个关于运行时函数的部分,用于动态获取类属性的列表:

objc_property_t *class_copyPropertyList(Class cls, unsigned int *outCount)

有了这个,使用获取属性列表并将它们放入字典的方法在NSObject上编写一个类别应该很容易。

答案 3 :(得分:0)

为了使用此属性,您需要有一组预定义的可能键。您不能将任意名称与点语法一起使用 - 它必须是第一个操作数的已知属性或访问者。所以不能有这种通用形式。但是如果你自己做了一个,那么变成字典就像做[self dictionaryWithValuesForKeys:listOfProperties]一样简单。

答案 4 :(得分:0)

我在其他地方看过这个,但这正是我想要的。上面的答案指向原料,但在这里,所有包装起来:http://retaincount.com/blog/?p=7