为什么我的NSMutableArray无法保存

时间:2014-07-10 19:49:55

标签: ios objective-c cocoa-touch

我试图将我的nsmutablearray保存到磁盘, 数组看起来:

       self.tableData = [[NSMutableArray alloc] initWithObjects:
                          [[Cell alloc] initWithName:@"dawdw" andImage:@"dwddw" andDescription:@"dawdw" andTypes:@"dawwd dawwd" andforWho:@"dwaadw"],
                          [[Cell alloc] initWithName:@"Kabanos" andImage:@"spodwwdwdrt.jpg" andDescription:@"dwdw" andTypes:@"dwdw dww" andforWho:@"dawwd"],
                          [[Cell alloc] initWithName:@"dwwd" andImage:@"dwwd" andDescription:@"dwwd" andTypes:@"wdwd daww" andforWho:@"dadawwa"],nil];


//execution
[self writeToPlist:@"fav.txt" withData:self.tableData];


- (void) writeToPlist: (NSString*)fileName withData:(NSMutableArray *)data
{
    NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString *finalPath = [documentsDirectory stringByAppendingPathComponent:fileName];

    [data writeToFile:finalPath atomically: YES];
}

//loading
- (NSMutableArray *) readFromPlist: (NSString *)fileName {
    NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString *finalPath = [documentsDirectory stringByAppendingPathComponent:fileName];

    BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:finalPath];

    if (fileExists) {
        NSMutableArray *arr = [[NSMutableArray alloc] initWithContentsOfFile:finalPath];
        return arr;
    } else {
        return nil;
    }
}

//load
 self.tableData = [self readFromPlist:@"fav.txt"];

,遗憾的是最后tableData是空的,我尝试了几种方法来保存nsmutablearray,但我无法弄清楚如何。

2 个答案:

答案 0 :(得分:1)

当您的可变数组包含自定义对象时,操作系统将不知道如何编码和解码它们。 可以通过将以下函数添加到类中来对自定义类进行编码和解码。 确保该课程符合 NSCoding

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

    self.var1 = [decoder decodeObjectForKey:@"var1"];
    self.var2 = [decoder decodeObjectForKey:@"var2"];
    .. and so on
    return self;
}

- (void)encodeWithCoder:(NSCoder *)encoder {
    [encoder encodeObject:self.var1 forKey:@"var1"];
    [encoder encodeObject:self.var2 forKey:@"var2"];
} 

现在存档 -

[NSKeyedArchiver archiveRootObject:<array of objects> toFile:@"/path/to/archive"];

取消归档

[NSKeyedUnarchiver unarchiveObjectWithFile:@"/path/to/archive"];

H个

答案 1 :(得分:0)

来自文档:

  

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

(强调我的)

您可以在Cell类上创建一个方法,将其转换为NSData或任何其他属性列表对象,将其放入数组然后保存。