NSArray writeToFile失败

Chr*_*ris 21 iphone file nsarray

我试图将一个内部有一些字典的数组保存到plist文件中,但它失败了.我没有得到任何错误.我在代码中使用另一个数组执行完全相同的几行,并且可以工作..我无法弄清楚为什么它不保存文件.

这是我保存文件的地方:(参见下面的一些调试器输出)

// When built parse through dictionary and save to file
    for ( NSString *keys in [dicByCountry allKeys] )
    {
        NSArray *arrr = [[NSArray alloc] initWithArray:[dicByCountry objectForKey:keys]];
        NSString *fname = [self filePath:[NSString stringWithFormat:@"regions.cid%@.plist",keys]];
        if (![arrr writeToFile:fname atomically:YES])
            NSLog(@"Could not write file regions.cid%@.plist",keys);
    }
Run Code Online (Sandbox Code Playgroud)

这里有一些GDB输出

(gdb) po fname
/Users/chris/Library/Application Support/iPhone Simulator/4.0/Applications/44A9FF9E-5715-4BF0-9BE2-525883281420/Documents/regions.cid0.plist


(gdb) po arrr
<__NSArrayI 0x8022b30>(
{
    countryID = "<null>";
    region = "?\U00e2vora";
    regionID = 16;
},
{
    countryID = "<null>";
    region = Vicenza;
    regionID = 14;
},
{
    countryID = "<null>";
    region = Wales;
    regionID = 23;
}
)
Run Code Online (Sandbox Code Playgroud)

war*_*enm 37

如果仔细阅读文档,则writeToFile:atomically:希望该数组仅包含可写入plist文件的对象.

只有类型的对象:

  • NSString
  • NSData
  • NSDate
  • NSNumber
  • NSArray
  • NSDictionary

是允许的.如果您要保存的数组中包含数组或字典,则将使用相同的条件检查它们的值.

这比s中通常允许的更具限制性NSArray.特别是,该值[NSNull null]是不可接受的.


Sau*_*hwa 27

我在序列化之前将NSArray或NSDictionary转换为NSData.以下是nsarray上用于序列化和反序列化的类别.这舒适处理一些数据是nsnull

@implementation NSArray(Plist)

-(BOOL)writeToPlistFile:(NSString*)filename{
    NSData * data = [NSKeyedArchiver archivedDataWithRootObject:self];
    NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString * documentsDirectory = [paths objectAtIndex:0];
    NSString * path = [documentsDirectory stringByAppendingPathComponent:filename];
    BOOL didWriteSuccessfull = [data writeToFile:path atomically:YES];
    return didWriteSuccessfull;
}

+(NSArray*)readFromPlistFile:(NSString*)filename{
    NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString * documentsDirectory = [paths objectAtIndex:0];
    NSString * path = [documentsDirectory stringByAppendingPathComponent:filename];
    NSData * data = [NSData dataWithContentsOfFile:path];
    return  [NSKeyedUnarchiver unarchiveObjectWithData:data];
}

@end //needs to be set for implementation
Run Code Online (Sandbox Code Playgroud)

  • 我有一个自定义类,它有许多不同的属性(`NSInteger`,`BOOL`等),存储在`NSArray`中.`[NSArray writeToFile:atomically:]`不起作用,但用`NSKeyedArchiver`将根对象(`NSArray`)转换为`NSData`确实有效! (2认同)