Ios 在终止应用程序后,属性列表数据是否会持续存在?

Ios 在终止应用程序后,属性列表数据是否会持续存在?,ios,objective-c,iphone,xcode,plist,Ios,Objective C,Iphone,Xcode,Plist,我已经创建了一个自定义属性列表文件。该文件存储在应用程序文档中。 当用户登录成功时,登录信息存储在plist中,并且工作正常。 plist内容在注销时被清除,这也可以正常工作。 当我仍然登录时,我关闭了应用程序。当应用程序打开我清除的plist数据时 用于保存到文件的代码: NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES); NSString *doc

我已经创建了一个自定义属性列表文件。该文件存储在应用程序文档中。 当用户登录成功时,登录信息存储在plist中,并且工作正常。 plist内容在注销时被清除,这也可以正常工作。 当我仍然登录时,我关闭了应用程序。当应用程序打开我清除的plist数据时

用于保存到文件的代码:

NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsPath = [paths objectAtIndex:0];
NSString *plistPath = [documentsPath stringByAppendingPathComponent:@"xxxxPlist.plist"];

if (![[NSFileManager defaultManager] fileExistsAtPath:plistPath])
{
    plistPath = [[NSBundle mainBundle] pathForResource:@"xxxxPlist" ofType:@"plist"];
}
dict=[[self cleanDictionary:[dict mutableCopy]] mutableCopy];

NSDictionary *plistDict=[[NSDictionary alloc] initWithObjectsAndKeys:dict,@"login_data", nil];
NSError *error = nil;

NSData *plistData = [NSPropertyListSerialization dataWithPropertyList:plistDict format:NSPropertyListXMLFormat_v1_0 options:NSPropertyListImmutable error:&error];


if(plistData)
{
    [plistData writeToFile:plistPath atomically:YES];
}
else
{
    //error here
    NSLog(@"%@ ",error);
}
用于获取数据的代码

NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsPath = [paths objectAtIndex:0];
NSString *plistPath = [documentsPath stringByAppendingPathComponent:@"xxxx.plist"];

if (![[NSFileManager defaultManager] fileExistsAtPath:plistPath])
{
    plistPath = [[NSBundle mainBundle] pathForResource:@"xxxxPlist" ofType:@"plist"];
}

NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:plistPath];
return [dict objectForKey:@"login_data"];

我想知道有什么办法可以持久保存数据吗?

有几件事可能会导致问题

保存到文件时 1) 我的理解是,您特别希望保存到/Documents文件夹,以确保文件的持久性

2) 所以您可以正确地构建以下路径

"/Documents/xxxxPlist.plist"
3) 但是,为什么要检查该位置是否已经存在文件

if (![[NSFileManager defaultManager] fileExistsAtPath:plistPath])
{
    plistPath = [[NSBundle mainBundle] pathForResource:@"xxxxPlist" ofType:@"plist"];
}
您只需在准备就绪时写入路径即可。 如果此位置有旧文件,它将被覆盖。 我的理解是这是你想要的行为,因为你已经读过那个文件,数据在字典“dict”中

4) 另外,请NSBundle为您的文件名提供路径

"xxxxPlist.plist"
存在这样一种风险,即如果碰巧存在这样的文件,它将返回其他路径,其中的文件名相同(不在/Documents中)。例如,如果您之前写的是/Cache文件夹(使用不同的代码),那么您的应用程序将继续获取/Cache路径,并继续在那里读/写(而不是在/Documents中)。使用现有的代码,在第一次运行时,path的值应该为零,所以不确定文件是如何创建的

5) 那么我不确定这条线到底是什么意思

dict=[[self cleanDictionary:[dict mutableCopy]] mutableCopy];
为什么要先创建一个可变副本,然后大概得到不可变副本并得到一个可变副本呢。无法清理字典:只返回它传递的相同可变副本

从文件读取时 1) 不确定为什么要先搜索其他文件

"/Documents/xxxx.plist" not "/Documents/xxxxPlist.plist"
另外,如果“xxxx.plist”存在,那么您将永远无法访问在另一节中编写的“xxxxPlist.plist”

2) 然后,是的,在您尝试读取文件之前,您必须检查文件是否存在于特定路径。但是,在您的情况下,如果它不存在,您不需要向NSBundle请求其他位置,因为您需要在/Documents中找到特定的文件,并且如果您的文件不在应该的位置,您不知道将从NSBundle获得什么。
因此,如果没有“xxxxPlist.plist”文件,这只是您第一次运行应用程序,您将创建您的初始目录。

重新启动后,您的plist数据将被删除?是的,当我尝试获取数据时,词典返回零。请检查此项。我的代码也遵循了相同的操作。这一项发生了什么