我正在使用XCode 4.2开发一个应用程序,在应用程序的一部分中,我需要在UITableView中存储NSString格式字符串,并在应用程序重新启动时再次使用它...
数据保存在NSMutableArray
变量中。我找到了一个使用旧XCodeversion的教程,其中包含这段代码:
- (void)applicationDidFinishLaunching:(UIApplication *)application {
NSArray *archivedArray = [NSKeyedUnarchiver unarchiveObjectWithFile:[self dataFilePath]];
if (archivedArray == nil) {
data = [[NSMutableArray alloc] init];
} else {
data = [[NSMutableArray alloc] initWithArray:archivedArray];
}
}
和这个功能
-(NSString *)dataFilePath{
NSString *dataFilePath;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES);
NSString *documentDirectory = [paths objectAtIndex:0];
dataFilePath = [documentDirectory stringByAppendingPathComponent:@"Test App-Info.plist"];
return dataFilePath;
}
我遇到以下两个问题:
即使切换视图,也不会保存1个数据 2-当我从设备上停止应用程序时(即我双击主按钮并将其从正在运行的应用程序列表中删除)应用程序崩溃:它转到此
int main(int argc, char *argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([HelloWorld18AppDelegate class]));
}
}
并且在行中:return UIApplicationMain(argc, argv, nil, NSStringFromClass([HelloWorld18AppDelegate class]));
我收到绿色错误Thread 1 : program received a signal "SIGKILL".
任何想法为什么这样做?
编辑: 如果我的描述中有任何遗漏信息,请告诉我
编辑:
使用此功能
保存数据-(void)saveData{
[NSKeyedArchiver archiveRootObject:[data copy] toFile:[self dataFilePath]];
}
编辑: 问题:我可能需要在某处使用loadData函数吗?如果是,那里需要什么?
答案 0 :(得分:0)
如果要归档字符串数组,则不需要使用NSKeyedArchiver; NSArray提供了writeToFile和initWithContentsOfFile方法。尝试一下,因为你不会对正在发生的事情感到困惑。当你这样做时,使用结果来查看它们是否成功(我注意到你没有捕获BOOL,告诉你是否正在保存你的数据)。
你需要独立于Xcode运行它,因为你不能使用你描述的技术,如果应用程序是从Xcode启动的,你强行退出应用程序 - 如果你这样做,你就会崩溃。相反,您必须通过运行应用程序加载到模拟器或设备上,在Xcode中停止应用程序,然后独立地在模拟器或设备上使用应用程序。现在,遗憾的是,您无法再在Xcode中看到该应用程序,因此您必须插入大量NSLog语句并稍后研究控制台以查看发生的情况。
答案 1 :(得分:0)
是的,您需要loadData
方法。您可能希望在应用代理application:didFinishLaunchingWithOptions:
或视图控制器的viewDidLoad
中调用它。看起来应该是这样的:
- (void)loadData
{
data = [NSKeyedUnarchiver unarchiveObjectWithFile:self.dataFilePath];
}
正如马特指出的那样,您可以使用NSArray
的{{1}}和writeToFile:atomically
方法。
关于arrayWithContentsOfFile:
:这是正常行为。当您“双击主按钮并将其从正在运行的应用程序列表中删除”时,系统会将其发送给SIGKILL。 SIGKILL信号以极端偏见终止接收过程。如果您不希望您的应用获得SIGKILL,请不要“将其从正在运行的应用程序列表中删除”。
答案 2 :(得分:-1)
尝试让应用程序在后台运行。转到Xcode中的info.plist文件并添加一个键应用程序不在后台运行并将其设置为NO
对于SIGKILL错误,它看起来像是内存问题。尝试使用NSZombies调试程序。