Objective-c加载和写plist - 错误

时间:2013-08-12 14:52:33

标签: objective-c file plist

嗨,我正在练习使用plist,我了解到有两种不同的加载方法

第一种方法:

NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documents = [path lastObject];
NSString *filePath = [documents stringByAppendingPathComponent:@"test.plist"]; 
self.array = [NSArray arrayWithContentsOfFile:filePath];

第二种方法:

NSString *filePath = [[NSBundle mainBundle]pathForResource:@"Ingredients" ofType:@"plist"];
self.array = [NSArray arrayWithContentsOfFile:filePath];

我不清楚哪种方式最好......但我注意到如果我使用第二种方法,我就不能用plist写字了。有人能告诉我更多关于它的事吗?哪种方式最好,最正确?有什么区别?

我正在做一些测试,我有一些代码仅使用一种方法......

//using this code the nslog will print null

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsPath = [paths objectAtIndex:0];
    NSString *filePath = [documentsPath stringByAppendingPathComponent:@"Ingredients.plist"];
    ingredients = [NSMutableArray arrayWithContentsOfFile:filePath];
    NSLog(@"ingredients:%@", self.ingredients);



//using this code the nslog will print the content of the array

    NSString *filePath = [[NSBundle mainBundle]pathForResource:@"Ingredients" ofType:@"plist"];
    ingredients = [NSMutableArray arrayWithContentsOfFile:filePath];

    NSLog(@"Authors:%@", self.ingredients);

1 个答案:

答案 0 :(得分:1)

第一种方法

您的应用程序(在非越狱设备上)在“沙盒”环境中运行。这意味着它只能访问自己内容中的文件和目录。例如文档

参考iOS Application Programming Guide

要访问应用程序沙箱的文档目录,您可以使用以下命令:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];

文档目录允许您存储应用创建或可能需要的文件和子目录。

要访问应用沙箱使用的目录中的文件(代替上面的paths):

[NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) objectAtIndex:0]

第二种方法

第二种方法用于在应用程序主程序包中写入文件。

主捆绑包是包含正在运行的应用程序的代码资源的捆绑包。如果您是应用程序开发人员,则这是最常用的捆绑包。主捆绑也是最容易检索的,因为它不要求您提供任何信息。

最好将文件从应用主程序包复制到应用程序文档目录,然后使用文档目录路径读取/写入文件。

如果您使用的是第一种方法,则需要将文件从主资源复制到文档目录。

将文件从应用程序包复制到应用程序文档目录的代码

#define FILE_NAME @"sample.plist"

// Function to create a writable copy of the bundled file in the application Documents directory.

- (void)createCopyOfFileIfNeeded {

    // First, test for existence.
    BOOL success;
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *error;
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *filePath = [documentsDirectory stringByAppendingPathComponent:FILE_NAME];

    success = [fileManager fileExistsAtPath:filePath];
    if (success){
        return;
    }
    // The writable file does not exist, so copy the default to the appropriate location.
    NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:FILE_NAME];
    success = [fileManager copyItemAtPath:defaultDBPath toPath:filePath error:&error];
    if (!success) {
        NSAssert1(0, @"Failed to create writable file with message '%@'.", [error localizedDescription]);
    }
}

Sample Code Dropbox Link