0

所以我试图将数组保存到文件中。这应该在以下代码中完成,但通过调用该 addProjectsObject方法,程序会崩溃并出现以下错误代码:

***** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSConcreteData count]: unrecognized selector sent to instance 0x7eeb800'**

我发布了我认为与问题相关的代码,我还需要提到在同一个filePath中存储了另一个文件,它运行良好。我突然想到路径可能是问题,但是由于两个文件的名称不同,这不应该是问题吗?

-(void) addProjectsObject:(NSString *)newProject{

    projects = [self getProjectsFromDisk];
    [projects addObject:newProject];
    [self saveProjectsToDisk];

}   



-(NSMutableArray *) getProjectsFromDisk{

    NSString* filePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString* fileName =  @"projects";
    NSString* fileAtPath = [filePath stringByAppendingPathComponent:fileName];

    if(![[NSFileManager defaultManager] fileExistsAtPath:fileAtPath])
    {
        [[NSFileManager defaultManager] createFileAtPath:fileAtPath contents:nil attributes:nil];}

    NSMutableArray* temp = [[NSMutableArray alloc]initWithArray:[NSData dataWithContentsOfFile:fileAtPath]]; 

    return temp;

}

-(void) saveProjectsToDisk {

    NSString* filePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString* fileName =  @"projects";
    NSString* fileAtPath = [filePath stringByAppendingPathComponent:fileName];

    if(![[NSFileManager defaultManager] fileExistsAtPath:fileAtPath])
    {
        [[NSFileManager defaultManager] createFileAtPath:fileAtPath contents:nil attributes:nil];}


    [projects writeToFile:fileAtPath atomically:NO];

}
4

2 回答 2

1

这是 cz 您分配了不适当的指针,您将 NSConcreteData 对象指针分配给 NSMutablearray 并尝试调用某些数组方法,因此发生了这种情况

于 2012-05-16T08:24:35.093 回答
1

NSData不是。_ NSArray

[[NSMutableArray alloc]initWithArray:]需要一个 NSArray 的实例。
[NSData dataWithContentsOfFile:fileAtPath]返回一个 NSData 的实例。
这两个不会一起工作。

如果projects是一个NSMutableArray简单的使用这个:

NSMutableArray* temp = [NSMutableArray arrayWithContentsOfFile:fileAtPath];

其余的代码也可以被剥离。无需检查文件是否存在,甚至无需在两行后创建文件即可覆盖它。

这也可以:

- (NSMutableArray *)projectsFromDisk {
    NSString* filePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString* fileName =  @"projects";
    NSString* fileAtPath = [filePath stringByAppendingPathComponent:fileName];
    NSMutableArray* temp = [NSMutableArray arrayWithContentsOfFile:fileAtPath];
    if (!temp) {
        // if file can't be read (does not exist, or invalid format) create an empty array
        temp = [NSMutableArray array];
    }
    return temp;
}

- (void)saveProjectsToDisk {
    NSString* filePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString* fileName =  @"projects";
    NSString* fileAtPath = [filePath stringByAppendingPathComponent:fileName];
    [projects writeToFile:fileAtPath atomically:NO];
}
于 2012-05-16T09:30:36.987 回答