嗨,我正在练习使用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);
答案 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]);
}
}