如何使用自定义对象存储NSArray?

时间:2011-02-20 16:52:24

标签: objective-c io storage

我有一个NSMutableArray,如果这是存储字符串,我可以使用这种方法读取并成功写入。

[array writeToFile:m_sApplicationPlistPath atomically:YES];

NSMutableArray *array = [[NSMutableArray alloc] initWithContentsOfFile:m_sApplicationPlistPath];

但是如果我的Array添加的东西不是简单的字符串,例如,我会向数组中添加一个特殊的Object,如下所示:

[array addObject:[[SpecialObject alloc] init]];

我发现我无法读回特殊对象,我该如何解决,谢谢。

4 个答案:

答案 0 :(得分:3)

实施NSCoding协议。 (encodeWithCoder和initWithCoder)

如果仍然无法使用writeToFile方法:atomically:那么你必须序列化NSArray以获取数据,然后将其写入文件。

NSData *data = NSKeyedArchiver archivedDataWithRootObject:theArray];

答案 1 :(得分:3)

我认为你不能这样做,因为[NSArray writeToFile:atomically:]方法使用属性列表,这些列表仅适用于某些数据类型(NSString,NSData,NSArray或NSDictionary)。

为了将数组写入文件,您可以使SpecialObject符合NSCoding协议,然后使用 - [NSKeyedArchiver archiveRootObject:toFile:]使用数组作为根对象保存数组

答案 2 :(得分:2)

您可以使用NSKeyValueCoding协议中定义的方法将自定义类的实例转换为NSDictionary的实例,然后再编写它们。重新读取plist文件后,可以进行类似的转换,以重新创建对象。

这是一个使用Book中声明的dictionaryWithValuesForKeys:方法将自定义NSKeyValueCoding类的实例数组转换为字典数组的示例(并由{{1}实现所以所有对象都继承了这种行为):

NSObject

同样,这是一种使用+ (NSArray *)dictionariesFromBooks:(NSArray *)books { NSMutableArray *bookDicts = [NSMutableArray arrayWithCapacity:[books count]]; for (Book *currBook in books) { NSDictionary *currDict = [currBook dictionaryWithValuesForKeys:[Book keys]]; [bookDicts addObject:currDict]; } return bookDicts; } 方法[{1}}

填充Book实例的方法
NSKeyValueCoding

通过一些工作,可以使其级联到嵌套的自定义对象。例如,如果setValuesForKeysWithDictionary:包含嵌套的+ (NSArray *)booksFromDictionaries:(NSArray *)bookDicts { NSMutableArray *books = [NSMutableArray arrayWithCapacity:[bookDicts count]]; for (NSDictionary *currDict in bookDicts) { Book *currBook = [[Book alloc] init]; [currBook setValuesForKeysWithDictionary:currDict]; [books addObject:currBook]; [currBook release]; } return books; } 实例,则可以覆盖Book方法,例如AuthorNSKeyValueCoding,以便动态转换实例。< / p>

答案 3 :(得分:0)

来自docs:

如果数组的内容都是属性列表对象(NSString,NSData,NSArray或NSDictionary对象),则此方法编写的文件可用于使用类方法arrayWithContentsOfFile:或实例方法initWithContentsOfFile初始化新数组: 。在写出文件之前,此方法以递归方式验证所有包含的对象是属性列表对象,如果所有对象都不是属性列表对象,则返回NO,因为生成的文件不是有效的属性列表。