Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 目标C.将字符串的对象保存到文件中_Ios_Objective C - Fatal编程技术网

Ios 目标C.将字符串的对象保存到文件中

Ios 目标C.将字符串的对象保存到文件中,ios,objective-c,Ios,Objective C,我试着在互联网上查找答案,但没有找到任何对我有帮助的 基本上,我有这些餐厅,我想保存在一个文件中,然后晚读。我将所有对象保存在一个数组中,以便以后使用 self.navigationItem.title = @"Restaurant Guide"; Restaurant *restaurant1 = [Restaurant new]; restaurant1.name=@"name1"; restaurant1.mark=@"1"; restaurant1.review=@"good"; Re

我试着在互联网上查找答案,但没有找到任何对我有帮助的

基本上,我有这些餐厅,我想保存在一个文件中,然后晚读。我将所有对象保存在一个数组中,以便以后使用

self.navigationItem.title = @"Restaurant Guide";
Restaurant *restaurant1 = [Restaurant new];
restaurant1.name=@"name1";
restaurant1.mark=@"1";
restaurant1.review=@"good";

Restaurant *restaurant2 = [Restaurant new];
restaurant2.name=@"name2";
restaurant2.mark=@"2";
restaurant2.review=@"bad";

restaurants = [NSArray arrayWithObjects:restaurant1, restaurant2, nil];
[restaurants writeToFile:(@"restaurantlist") atomically:NO];
但我想如果我写了WriteFile,它就不会工作了,因为它不是一些字符串,而是一些对象。那我该怎么做呢


谢谢

要在文件中保存自定义对象,您必须将该类设置为
NSCoding

这里有一个很好的教程


基本上,您必须告诉运行时如何将对象转换为字节,以便将其保存在文件中。通过实现协议,您可以做到这一点。默认情况下,您的
NSDate
NSString
NSNumber
等都是
NSCoding
兼容的,因此保存这些对象时不会出现任何异常。

要在文件中保存自定义对象,您必须将该类设置为
NSCoding
投诉

这里有一个很好的教程


基本上,您必须告诉运行时如何将对象转换为字节,以便将其保存在文件中。通过实现协议,您可以做到这一点。默认情况下,您的
NSDate
NSString
NSNumber
等都是
NSCoding
兼容的,所以保存这些对象时我们不会出现任何异常。

您应该在餐厅类中实现
协议,并且应该在餐厅.m文件中实现两个方法:

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super init];
    if (self) {
        _name = [aDecoder decodeObjectForKey:@"NAME"];
        _mark = [aDecoder decodeObjectForKey:@"MARK"];
        _review = [aDecoder decodeObjectForKey:@"REVIEW"];
    }
    return self;
}

- (void)encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeObject:self.name forKey:@"NAME"];
    [aCoder encodeObject:self.mark forKey:@"MARK"];
    [aCoder encodeObject:self.review forKey:@"REVIEW"];
}
之后,您可以将阵列保存到文件:

- (void)saveToFile:(NSArray*)ar
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    //data.plist is name of your file, change it if require
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"data.plist"];

    [ar writeToFile:path atomically:YES];
}

您应该在Restaurant类中实现
协议,并且应该在Restaurant.m文件中实现两个方法:

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super init];
    if (self) {
        _name = [aDecoder decodeObjectForKey:@"NAME"];
        _mark = [aDecoder decodeObjectForKey:@"MARK"];
        _review = [aDecoder decodeObjectForKey:@"REVIEW"];
    }
    return self;
}

- (void)encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeObject:self.name forKey:@"NAME"];
    [aCoder encodeObject:self.mark forKey:@"MARK"];
    [aCoder encodeObject:self.review forKey:@"REVIEW"];
}
之后,您可以将阵列保存到文件:

- (void)saveToFile:(NSArray*)ar
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    //data.plist is name of your file, change it if require
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"data.plist"];

    [ar writeToFile:path atomically:YES];
}

writeToFile:atomic:
仅适用于属性列表对象,您必须用编码的
NSData
对象替换自定义类对象。存档数组并在存档中调用
writeToFile:atomicly:
更容易。
writeToFile:atomicly:
仅适用于属性列表对象,您必须用编码的
NSData
对象替换自定义类对象。只需归档阵列并在归档中调用
writeToFile:atomically:
,就更容易了。