Property List Programming Guide(三)

来源:互联网 发布:搬瓦工vps搭建ss优化 编辑:程序博客网 时间:2024/05/29 07:07

属性列表是一种结构化的数据表示方法,在 Cocoa 和 Core Foundation 中经常适应这种方式来存储、组织已经获取标准类型的数据。我们通常将属性列表简称为 plist。在 OS X 和 iOS 中会有很多地方使用到属性列表。比如,在 OS X 的 Finder 中就是利用属性列表来保存文件以及目录的属性的。而 iOS 的应用则在设置中使用属性列表来表示相应的设置项。本节描述了什么是属性列表以及你应该如何使用属性列表。

注意:尽管用户以及应用的设置是使用属性列表来保存数据的,但是你不能直接使用属性列表的 API 来对之进行修改。如果你需要修改这些文件,那么应该使用 Preference 来完成。

什么是属性列表?

属性列表是基于抽象的方式,用于表达数据的简单结构的一种形式。属性列表中的每一项都是有限的几种数据类型。其中一些是基本数据类型,其他的则是容器类。基本类型有字符串、数字、二进制、日期以及布尔值。而容器类则是数组和字典。容器类既可以存放基本类型也可以存放其他的容器类。属性列表对象的根节点可以说是整个数据体系中的顶点。而根节点不一定非要是字典或者是数组,即便我们用字符串、数字、以及日期等作为根节点也是可以的。

在最基本的抽象中,我们可以派生出属性列表数据的静态表示以及运行时的表示。静态的表示,主要是用于存储,所以它既可以是 XML 格式的,也可以是二进制数据。(二进制的数据更加紧凑,在读取时会更快)在 XML 中,每种类型都是由特定元素来表示的。而在运行时的表示则是基于各个属性列表元素对象所对应的抽象类型。这些对象可以是 Cocoa 或者 Core Foundation 中的对象。

抽象类型 XML 元素 Cocoa 类 Core Foundation 类型 数组 <array> NSArray CFArray(CFArrayRef) 字典 <dict> NSDictionary CFDictionary(CFDictionaryRef) 字符串 <string> NSString CFString(CFStringRef) 数据 <data> NSData CFData(CFDataRef) 日期 <date> NSDate CFDate(CFDateRef) 数字-整数 <integer> NSNumber(intValue) CFNumber(CFNumberRef, integer value) 数字-浮点数 <real> NSNumber(floatValue) CFNumber(CFNumberRef, floating-point value) 布尔值 <true/> 或 <false/> NSNumber(boolValue == YES 或 boolValue == NO) CFBoolean(CFBooleanRef; kCFBooleanTrue 或 kCFBooleanFalse)

一般来说, Cocoa 和 CoreFoundation 中的这些对象我们都将之称为属性列表对象。所以,你可以认为有一个属性列表对象类,它是这些类共同的抽象父类。如果某个方法调用后会获得一个属性列表对象,那么你获得这个对象必然是上面这些类的实例。如果一个属性列表是一个容器对象,那么它所包含的所有对象都必须是属性列表对象。否则的话我们是没有办法将这个属性列表对象存储起来的。另外,尽管 NSDictionary 以及 CFDictionary 对象允许用户将他们的键设置为字符串之外的任何类型,但是这样会导致集合无法被存储为属性列表对象。

这些类型的数据都可以自动在 Cocoa 类型以及它们自身之间进行转换。我们可以直接使用 Core Foundation 属性列表 API 来对 Cocoa 对象进行转换。在大多数情况下,由 NSPropertyListSerialization 类提供的方法都应该保证一定的灵活性。

什么时候使用属性列表

对于很多应用来说,在运行结束之后需要某种机制来存储一些在运行中产生的数据。当你需要存储的数据量不大的时候(小于几百k),属性列表可以为你提供一种统一且便捷的方式来操作,存储以及访问数据。

有些情况下,属性列表结构可能并不高效。比如,如果你需要存储大量,复杂的对象,或者属性列表中不支持的对象,又或者是某些可更改设置并且可保留设置的对象,这种时候,应该使用归档。

如果你需要实现用户或者应用的设置,那么 Cocoa 专门提供了一个类用用于实现这种功能。当用户默认设置系统使用属性列表来存储信息的时候,你不需要直接访问 plist 文件本身,可以直接通过 API 来进行访问。

需要注意的是,属性列表主要是用于存储字符串以及数字组成的数据。如果用于存储大量的二进制数据的话,你会发现属性列表的效率会变得异常低。

属性列表的表示

属性列表可以用三种不同的方式来存储:XML 形式,二进制,或者旧式的 ASCII 的形式。属性列表可以序列化成 XML 或者二进制格式。而对于 ASCII,序列化 API 只提供只读的方法。

XML 格式的属性列表比二进制形式更加方便,并且可以手动更改。不过二进制的数据更加紧凑,所以二进制的属性列表加载会比 XML 要快,并且对内存的消耗也更少。通常来说,属性列表文件不会太大,这种时候 XML 文件便捷性更加重要。所以通常情况下我们都会使用 XML 文件来存储属性列表对象。如果你需要存储大量数据,那么二进制的属性列表或者归档,又或者自定义数据格式将会是更加好的选择。

0 0