创建:2011.06.14
ObjC编码有一种需求,即同一个对象只能编码一次,无论它被引用了多少次。因此,编码文件的结构,和代码中类的结构并不相同,也不够直观。
为了达到上述目的,直观的做法是:
#将所有的对象全部列出到一个数组中。
#每个对象的成员变量写出成员变量名,但是,它的值要指向上述数组中的索引。
#如果多个对象引用了一个对象,那么该对象值在数组中生成一次,而其它则都是指向它的索引。
举个实例说明一下:
#定义一个类A。
@interface A : NSObject {
NSString *mStr;
NSString *m2Str;
int mInt;
}
@end
#将生成的plist文件是UTF8编码,但是没有BOM信息,可以使用TextWrangler来加入一个BOM。这样FireFox就能 识别了。
#将文件改名为xml。
#拖拽到Firefox中打开。
#内容如下:(我加了注释)
<plist version="1.0">
<dict>
<key>$archiver</key> // 1.略
<string>NSKeyedArchiver</string>
<key>$objects</key> // 2.很重要,下面详细叙述。
<array> //
<string>$null</string> // 2.0 对象0:string对象,值为null。
<dict> // 2.1 a对象。
<key>$class</key> // 该对象的类(即A)的对象的索引。
<dict>
<key>CF$UID</key>
<integer>4</integer> // 指明A的信息在“4”中。即2.4中。
</dict>
<key>m2Str</key> // m2Str的信息。
<dict>
<key>CF$UID</key>
<integer>3</integer> // 指明A的信息在“3”中。即2.3中。
</dict>
<key>mInt</key> // mInt的信息。
<integer>123456</integer>
<key>mStr</key> // mStr的信息。
<dict>
<key>CF$UID</key>
<integer>2</integer> // 指明A的信息在“3”中。即2.2中。
</dict>
</dict>
<string>String111</string> // 2.2
<string>String222</string> // 2.3
<dict> // 2.4 列出A对象的类的信息。
<key>$classes</key> // 2.4.0 A对象的父类。
<array>
<string>A</string>
<string>NSObject</string>
</array>
<key>$classname</key> // 2.4.1 A对象的类名。
<string>A</string>
</dict>
</array>
<key>$top</key> // 3.略
<dict>
<key>root</key>
<dict>
<key>CF$UID</key>
<integer>1</integer>
</dict>
</dict>
<key>$version</key> // 4.略
<integer>100000</integer>
</dict>
</plist>
#
array编码了所有的对象。类型也编码为一种对象。
array的顶层子节点列出所有的NSObject的派生类对象。
第一个都是<string>$null</string>,不考虑它。
第二个是Root对象。即[NSKeyedArchiver archivedDataWithRootObject:a];中的a。
array的其他的顶层子节点都是Root对象中直接或简介关联到的对象,即要编码的全部对象。
如果是内建的NSObject的类型,例如NSString,则直接列出其值, 如<string>String222</string>
如果不是内建的NSObject的派生类的类型,则又是一个<dict>。
每个对象都首先列出该对象类型在array的索引,然后依次是各个成员变量。
成员变量列出名字。如果值是非NSObject型,则直接列出值。否则指向array的索引。
#依次类推。
+++++