我有一个NSMutableArray,如果这是存储字符串,我可以使用这种方法读取并成功写入。
[array writeToFile:m_sApplicationPlistPath atomically:YES];
NSMutableArray *array = [[NSMutableArray alloc] initWithContentsOfFile:m_sApplicationPlistPath];
但是如果我的Array添加的东西不是简单的字符串,例如,我会向数组中添加一个特殊的Object,如下所示:
[array addObject:[[SpecialObject alloc] init]];
我发现我无法读回特殊对象,我该如何解决,谢谢。
答案 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
方法,例如Author
和NSKeyValueCoding
,以便动态转换实例。< / p>
答案 3 :(得分:0)
来自docs:
如果数组的内容都是属性列表对象(NSString,NSData,NSArray或NSDictionary对象),则此方法编写的文件可用于使用类方法arrayWithContentsOfFile:或实例方法initWithContentsOfFile初始化新数组: 。在写出文件之前,此方法以递归方式验证所有包含的对象是属性列表对象,如果所有对象都不是属性列表对象,则返回NO,因为生成的文件不是有效的属性列表。