我正在尝试序列化实现 NSMutableArrays 协议(protocol)的 NSObjects 的两个 NSCoding。然而,它适用于一个 ( 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];
}

我使用调试器逐步执行此方法,并在运行最后两行代码后,检查两个 BOOL 的值。 BOOL cNO 并且 BOOL sYESstacks 数组实际上是空的(这可能是它起作用的原因)。 cards 数组有内容。为什么包含内容的数组失败?我想不通。我查看了 SOF 上的许多线程,每个线程都说问题是因为他们正在编写的文件的保护级别阻止了他们写入。这不是我的问题,因为我正在写入 Documents 文件夹。我已经双重和三重检查过 rootStack.cardsrootStack.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;
}

每个字段都是 NSString、NSNumber 或 UIColor。

谢谢你的帮助

最佳答案

您将属性列表与归档混淆了。这很容易做到。
writeToFile:atomically: 要求内容符合属性列表;也就是说,数组中的所有对象都是属性列表(字典、字符串、数据、数组等)中允许的类之一的实例。

请参阅: writeToFile:atomically:'s documentation

您想要的是 NSArchiver ,更具体地说,是阅读 archiving guide

关于iPhone/Objective-C : NSMutableArray writeToFile won't write to file. 总是返回 NO,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2767465/

10-08 20:53