【问题标题】:Can't figure out about saving files不知道如何保存文件
【发布时间】:2012-02-15 22:19:55
【问题描述】:

我正在尝试将我的对象保存到 iPad 上的文件系统中,但我似乎做错了什么。以下是我归档对象的方式:

NSString *localizedPath = [self getPlistFilePath];
NSString *fileName = [NSString stringWithFormat:@"%@.plist", character.infoName];
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:character];

fileName = [fileName stringByReplacingOccurrencesOfString:@" " withString:@"_"];
localizedPath = [localizedPath stringByAppendingPathComponent:fileName];

NSLog(@"File Path: %@", localizedPath);

if(data) {
    NSError *writingError;

    BOOL wasWritten = [data writeToFile:localizedPath options:NSDataWritingAtomic error:&writingError];

    if(!wasWritten) {
        NSLog(@"%@", [writingError localizedDescription]);
    }
}

现在,这将创建一个我可以在文件系统上查看和读取的 plist 文件。当我尝试使用以下方法取消归档时:

NSError *error;
NSString *directory = [self getPlistFilePath];
NSArray *files = [[NSFileManager defaultManager]contentsOfDirectoryAtPath:directory error:&error];
NSMutableArray *characters = [[NSMutableArray alloc]init];

for(NSString *path in files) {
    if(![path hasSuffix:@"plist"]) {
        continue;
    }
    NSString *fullPath = [directory stringByAppendingPathComponent:path];
    NSData *data = [NSData dataWithContentsOfFile:fullPath];
    IRSkillsObject *object = [NSKeyedUnarchiver unarchiveObjectWithData:data]; // get EXEC_BAD_ACCESS here...
    [data release];

    [characters addObject:object];
}

我收到 EXEC_BAD_ACCESS 错误。

IRSkillsObject 符合NSCoding 协议。你可以看到,我评论了我得到错误的那一行。

我确定这是我做错了,但我就是看不到。我试图通过调试器逐步完成(在对象的initWithCoder: 方法中放置一个断点),但我没有收到任何错误。事实上,它在我观看时将数据正确地放置在对象中。但是一旦完成加载数据,就会出现错误。我曾尝试使用retain 方法,但没有帮助。

如果您能提供任何帮助,我们将不胜感激!

【问题讨论】:

    标签: objective-c ios nskeyedarchiver property-list


    【解决方案1】:

    您正在释放 data 而不分配它。

    NSData *data = [NSData dataWithContentsOfFile:fullPath];
    IRSkillsObject *object = [NSKeyedUnarchiver unarchiveObjectWithData:data];
    [data release];
    

    所以试试这个:

    NSData *data = [[NSData alloc] initWithContentsOfFile:fullPath];
    IRSkillsObject *object = [NSKeyedUnarchiver unarchiveObjectWithData:data];
    [data release];    
    

    【讨论】:

    • 或者去掉[数据发布]这一行;
    • 好的,所以可能不是上述方法导致了问题。如果我用[[NSData alloc] initWithContentsOfFile:fullPath]; 替换[NSData datawithContentsOfFile:fullPath];,它会做同样的事情。我的对象会不会有什么东西?谢谢
    • 同一个文件夹中是否还有其他 plist 文件?如果是这样,请将它们全部删除并尝试再次归档/取消归档。
    • 我试过了,没有任何变化。只是为了澄清我所做的事情:IRSkillsObject 是...复合类?因为制作 IRSkillsObject 有很多代码,所以我将它分解为多个类,每个类都继承自另一个类,直到最后一个继承自 NSObject。我确保每个类都使用NSCoding 协议,并且每个类都包含-initWithCoder:-encodeWithCoder: 方法。这样做我可能会错过什么吗?
    【解决方案2】:

    当发现 EXEC_BAD_ACCESS 错误时。通常是因为一些数据已经发布,但代码中仍然需要它。

    也许您的 IRSkillsObject 中有一个属性未保留在 -initWithCoder:

    【讨论】:

    • 就是这样。我对目标 c 和内存管理等仍然很陌生(我的历史主要在 .net 中......)。当我设置数据(即infoName = [coder decodeObjectForKey:kNameKey];)时,我正在为对象设置 iVar,然后释放该项目。当我将其更改为 self.[propertyname](即self.infoName = [coder decodeObjectForKey:kNameKey];)时,它起作用了。
    猜你喜欢
    • 2020-11-02
    • 1970-01-01
    • 1970-01-01
    • 2011-10-11
    • 2015-08-11
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    • 1970-01-01
    相关资源
    最近更新 更多