0

嗨,我正在练习 plist,我了解到有 2 种不同的方式来加载它们

第一种方法:

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);
4

1 回答 1

1

第一种方法

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

参考iOS 应用程序编程指南

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

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

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

要访问您的应用程序沙箱的目录中的文件,请使用(代替paths上述):

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

第二种方法

第二种方法用于将文件写入Apps 主包中。

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

最好将文件从App Main Bundle复制到App Document Directory,然后使用文档目录路径读取/写入文件。

如果您使用第一种方法,则需要将文件从主要资源复制到 Documents Directory。

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

#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]);
    }
}

示例代码 Dropbox 链接

于 2013-08-12T15:04:06.190 回答