为什么保存和加载文件代码在iphone模拟器上工作但在设备上失败

时间:2010-01-04 03:32:02

标签: iphone sdk

(void) loadDataFromDisk
{
    NSMutableData *data = [[NSMutableData alloc] initWithContentsOfFile:[self pathToDataFile]];
    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];


    _cells = [[unarchiver decodeObjectForKey:@"Board"] retain];

    [unarchiver release];
    [data release]; 
}

(void) saveDataToDisk
{   
    NSMutableData *data = [NSMutableData alloc];
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
    [archiver encodeObject:_cells forKey:@"Board"];

    [archiver finishEncoding];

    [data writeToFile:[self pathToDataFile] atomically:YES];

    //[array release];  
    [data release];
    //NSMutableData 
}

(BOOL)gameDataExists
{
    return [[NSFileManager defaultManager] fileExistsAtPath:[self pathToDataFile]];
}

(NSString *)pathToDataFile
{
    NSString *path = [[NSBundle mainBundle] bundlePath];
    return [path stringByAppendingPathComponent: GAME_DAT];
}

上面的代码在模拟器上工作但在device.it上失败似乎是文件不能 在我退出并重新加载我的应用程序后找到。 如果我像这样实现pathToDataFile:

(NSString *)pathToDataFile
{
    NSArray * path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
    NSString *docDir = [path objectAtIndex:0];
    return [docDir stringByAppendingPathComponent:GAME_DAT];
}

文件保存和重新加载在设备上工作,但在我调用[self setNeedsDisplay]后,我在视图中实现的drawRect方法无法调用。

克里斯 可以

1 个答案:

答案 0 :(得分:1)

捆绑路径在设备上是只读的,但在仿真器上是可读写的。因此,在设备上任何尝试写入的都将失败。

使用文档目录的第二种方法应该可以解决问题。

我不知道为什么[self setNeedsDisplay]对你不起作用,但它可能与这个问题无关。

我在您的代码中发现了一个错误:

NSMutableData *data = [NSMutableData alloc];

应该是:

NSMutableData *data = [[NSMutableData alloc] init];

您还应该在saveDataToDisk方法的末尾发布归档程序。