2011-11-30 37 views
0

我正在使用XCode 4.2开发应用程序,并且在应用程序的一部分中,我需要将NSString格式字符串存储在UITableView中,并在应用程序重新启动...Objective C将数据保存在UItableView视图中,即使在关闭应用程序后

数据保存在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

我看不到正在保存你的数据在哪里。 – user523234

+0

感谢您的回复,我编辑我的问题 – user1051935

+0

我编辑我的问题感谢 – user1051935

回答

-1

试着让应用程序在后台运行。转到Xcode中的info.plist文件并添加一个键应用程序不会在后台运行并将其设置为NO

对于SIGKILL错误,它看起来像是内存问题。尝试使用NSZombies调试程序。

+0

我改变了plist中值,你教我,什么都没有发生,当我切换视图表中的他仍然得到的数据擦除,即使... 而内存泄漏问题消失了......我打扫应用程序,一切都很好... – user1051935

0

如果您归档字符串数组,则不需要使用NSKeyedArchiver; NSArray提供了writeToFile和initWithContentsOfFile方法。尝试一下,因为你不会对发生的事情感到困惑。当你这样做时,使用结果来查看它们是否成功(例如,我注意到你没有捕获到告诉你数据是否被保存的BOOL)。

您需要独立于Xcode运行此操作,因为如果应用程序是从Xcode启动的,则无法使用描述强制退出应用程序的技术 - 如果这样做,您将会崩溃。相反,您必须通过运行应用程序加载到模拟器或设备上,在Xcode中停止应用程序,然后独立使用模拟器或设备上的应用程序。现在,不幸的是,你不能再在Xcode中看到这个应用程序,所以你将不得不插入大量的NSLog语句,稍后再研究控制台,看看发生了什么。

+0

我很新的应用程序developpment,你介意给我一个代码示例? – user1051935

0

是的,你需要一个loadData方法。您可能想要在您的应用代理的application:didFinishLaunchingWithOptions:或您的视图控制器的viewDidLoad中调用它。它应该是这个样子:

- (void)loadData 
{ 
    data = [NSKeyedUnarchiver unarchiveObjectWithFile:self.dataFilePath]; 
} 

马特指出的那样,你也可以使用NSArraywriteToFile:atomicallyarrayWithContentsOfFile:方法。

关于SIGKILL:这是正常的行为。当你“在主键双击并运行应用程序的列表中删除”,系统SIGKILL发送。 SIGKILL信号以极端偏见终止接收过程。如果你不想让你的应用程序获得SIGKILL,不“从运行的应用程序的列表中删除”。

+0

您好罗布 我试图把它放在了viewDidLoad中的功能和它的作品,除了以下情况完全正常: 当我(在主键双clicing和运行的应用程序的列表中删除)终止该应用程序切换视图中的数据被删除时,甚至当我调用该函数loadData 谢谢你的SIGKILL信息数据被删除 ,我会记住它的未来 – user1051935

相关问题