iPhone/Objective-C:NSMutableArray writeToFile赢得';不要写入文件。总是返回NO

iPhone/Objective-C:NSMutableArray writeToFile赢得';不要写入文件。总是返回NO,iphone,objective-c,ipad,Iphone,Objective C,Ipad,我正在尝试序列化实现NSCoding协议的NSObjects的两个nsmutablearray。但是,它适用于一个(堆栈)而不适用于另一个(卡)。我有以下代码块: -(void) saveCards { NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString* documentsDirectory = [paths obj

我正在尝试序列化实现
NSCoding
协议的
NSObjects
的两个
nsmutablearray
。但是,它适用于一个(
堆栈
)而不适用于另一个(
)。我有以下代码块:

-(void) saveCards
{
    NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString* documentsDirectory = [paths objectAtIndex:0];

    NSString* cardsFile = [documentsDirectory stringByAppendingPathComponent:@"cards.state"];
    NSString* stacksFile = [documentsDirectory stringByAppendingPathComponent:@"stacks.state"];
    BOOL c = [rootStack.cards writeToFile:cardsFile atomically:YES];
    BOOL s = [rootStack.stacks writeToFile:stacksFile atomically:YES];
}
我使用调试器逐步完成这个方法,在最后两行代码运行之后,我检查两个
BOOL
s的值<代码>布尔c是
布尔s
堆栈
数组实际上是空的(这可能就是它工作的原因)。
数组包含内容。为什么包含内容的数组出现故障?我想不出来。我在SOF上查看了很多线程,每个线程都说问题是因为他们正在编写的文件的保护级别阻止了他们编写。这不是我的问题,因为我正在写文档文件夹。我双重和三重检查了
rootStack.cards
rootStack.stacks
是否为零。我检查过卡片上确实有内容

下面是我的Notecard类的编码器方法(我添加了所有
if
stations作为尝试解决此问题的一部分,以确保尝试编码nil值不会破坏某些内容):

每个字段都是NSString、NSNumber或UIColor


感谢您的帮助

您将属性列表与存档混淆了。这很容易做到

writeToFile:atomic:
要求内容符合属性列表;也就是说,数组中的所有对象都是属性列表(字典、字符串、数据、数组等)中允许的类之一的实例

请参阅:


您需要的是
NSArchiver
,更具体地说,是读取
writeToFile:atomically:
NSMutableArray
上的
方法,仅当数组的所有元素都是属性列表对象时,您调用的方法才起作用(
NSString
NSData
NSArray
NSDictionary
对象)正在执行。这与使用NSKeyedArchiver和NSCoding协议执行的键控存档不同。有关详细信息,请参阅

这里的具体问题是,
UIColor
不是属性列表对象。但是,它确实实现了
NSCoding
协议,并且应该在存档中工作。请尝试类似的操作

BOOL c  = [NSKeyedArchiver archiveRootObject:rootStack.card
                                      toFile:cardsFile];
BOOL s  = [NSKeyedArchiver archiveRootObject:rootStack.stacks
                                      toFile:stacksFile];
BOOL c  = [NSKeyedArchiver archiveRootObject:rootStack.card
                                      toFile:cardsFile];
BOOL s  = [NSKeyedArchiver archiveRootObject:rootStack.stacks
                                      toFile:stacksFile];