iPhone/Objective-C:NSMutableArray writeToFile不会写入文件.始终返回NO

Joe*_*oel 4 iphone objective-c ipad

我试图序列2 NSMutableArraysNSObjects实现的NSCoding协议.但是它适用于one(stacks)而不适用于其他(cards).我有以下代码块:

-(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];
}
Run Code Online (Sandbox Code Playgroud)

我使用调试器逐步执行此方法,并在最后两行代码运行后,检查两个BOOLs 的值.BOOL cNOBOOL sYES.该stacks数组实际上是空的(这可能是它工作的原因).该cards数组有内容.为什么包含内容的数组失败了?我无法弄清楚这一点.我查看了SOF上的大量线程,他们每个人都说这个问题是因为他们写的文件的保护级别阻止了他们编写.这不是我的问题,因为我正在写入Documents文件夹.我已经加倍并且检查过,既不是rootStack.cards也不rootStack.stacks是.而且我已经检查过卡片确实有内容.

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

-(void) encodeWithCoder:(NSCoder *)encoder
{
    if(text)
        [encoder encodeObject:text forKey:@"text"];
    if(backText)
        [encoder encodeObject:backText forKey:@"backText"];
    if(x)
        [encoder encodeObject:x forKey:@"x"];
    if(y)
        [encoder encodeObject:y forKey:@"y"];
    if(width)
        [encoder encodeObject:width forKey:@"width"];
    if(height)
        [encoder encodeObject:height forKey:@"height"];
    if(timeCreated)
        [encoder encodeObject:timeCreated forKey:@"timeCreated"];
    if(audioManagerTicket)
        [encoder encodeObject:audioManagerTicket forKey:@"audioManagerTicket"];
    if(backgroundColor)
        [encoder encodeObject:backgroundColor forKey:@"backgroundColor"];
}

-(id) initWithCoder:(NSCoder *)decoder
{
    self = [super init];
    if(!self)
        return nil;

    self.text               = [decoder decodeObjectForKey:@"text"];
    self.backText           = [decoder decodeObjectForKey:@"backText"];
    self.x                  = [decoder decodeObjectForKey:@"x"];
    self.y                  = [decoder decodeObjectForKey:@"y"];
    self.width              = [decoder decodeObjectForKey:@"width"];
    self.height             = [decoder decodeObjectForKey:@"height"];
    self.timeCreated        = [decoder decodeObjectForKey:@"timeCreated"];
    self.audioManagerTicket = [decoder decodeObjectForKey:@"audioManagerTicket"];
    self.backgroundColor    = [decoder decodeObjectForKey:@"backgroundColor"];

    return self;
}
Run Code Online (Sandbox Code Playgroud)

每个字段都是NSString,NSNumber或UIColor.

谢谢你的帮助

bbu*_*bum 14

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

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

请参阅:writeToFile:atomically:的文档.

您想要的是NSArchiver,更具体地说,阅读归档指南.