如何直接从plist文件创建目标c对象?

时间:2009-09-06 05:03:43

标签: iphone objective-c

IRC上有人告诉我,我可以直接从plist文件中创建目标c对象,这样我就不必在任何地方为字符串的序列化/反序列化指定字符串。

有谁知道怎么做?

我想简单地拥有像这样的plist

<array>
  <object>
    <id>my unique id</id>
    <description>first items description</description>
  </object>
</array>

并以某种方式将其直接反序列化为目标c对象,而无需在代码中的任何位置指定文字字符串“description”或“id”。

这可能是不可能的,但我无法在网上或在SO上找到这样做或者说这是不可能的。

另外,我想跟进IRC家伙说的话,但是没有时间在那里问他。

非常感谢任何帮助,

-Vandelizer

4 个答案:

答案 0 :(得分:4)

您正在寻找班级序列化。 Apple有一个关于它的对象存档方法的指南here。一些搜索关键词是“档案”“NSCoder”和“序列化”。

基本上你想让你的类实现NSCoding接口。然后,您可以创建方法-(void)encodeWithCoder:(NSCoder*)coder- (id)initWithCoder:(NSCoder *)coder。前者用于写入数据,后者用于从数据创建对象。有关如何实现这些方法的信息,请参阅“编码和解码对象”部分。

然后,当你想写一个文件时,你可以创建一个对象的NSArray,并调用[NSKeyedArchiver archiveRootObject:toFile:]将数组写入文件,然后[NSKeyedUnarchiver unarchiveObjectWithFile:]来读取文件。 / p>

答案 1 :(得分:2)

根据定义,plist包含以下任何类型:数组,字典,字符串,实数,整数,布尔值,日期和数据)。如果您使用的是真正的plist,则可以使用一行代码实例化它包含的对象。请参阅NSPropertyListSerialization方法:

propertyListFromData:mutabilityOption:format:errorDescription

二进制plists,可以包含任何对象,可以使用NSKeyedArchiver和NSKeyedUnarchiver进行编写和读取。要使用这些,你必须采用NSCoding协议这里是一个从NSObject继承的对象中的这些方法的一个例子,它有两个属性:userId和userEmail。

   + (void) initialize
    {
        [self setVersion:1]; // increment when you object format changes (add or remove properties)
    }

    - (id) initWithCoder:(NSCoder *)coder
    {
        if (self = [super init])
        {
            NSInteger storedClassVersion = [coder versionForClassName:NSStringFromClass([self class])];
            self.userId = [coder decodeObjectForKey:@"userid"];
            self.userEmail = [coder decodeObjectForKey:@"useremail"];
            if (storedClassVersion > 1)
            {
                // Use this block to conditionally read properties in versions greater than 1
            }
        }
        return self;
    }

    - (void) encodeWithCoder:(NSCoder *)coder
    {   
        [coder encodeObject:self.userId forKey:@"userid"];
        [coder encodeObject:self.userEmail forKey:@"useremail"];
    }

归档时,我发现将所有要保留在NSDictionary中的对象包装起来很有用。这允许您在取消归档时按键查找单个对象。 NSDictionary支持NSCoding协议,因此非常容易实现。

答案 2 :(得分:1)

值得注意的是,有两种归档器;一个'哑'',它只是持久化对象图,一个'keyed'一个允许数据结构随时间演变。键控归档器是一个更好的选择(也是首选),因为您可以将存储元素类型与持久存储时间分开。

答案 3 :(得分:1)

您可能正在寻找或不寻找对象的序列化。如果要读取XML plist中的值,并且其中的值都是有效的plist类型,那么只需将XML吸入NSString,然后向它发送-propertyList消息。你会得到一个id,其类型将取决于所讨论的plist中的内容。

  • (id)propertyList 将接收器解析为属性列表的文本表示,根据最顶层的元素返回NSString,NSData,NSArray或NSDictionary对象。