目标C,即使在关闭应用程序之后,也将数据保存在UItableView视图中

时间:2011-11-30 02:45:10

标签: iphone objective-c ios uitableview xcode4.2

我正在使用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函数吗?如果是,那里需要什么?

3 个答案:

答案 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调试程序。