Arrays 保存iOS应用程序阵列

Arrays 保存iOS应用程序阵列,arrays,ios,save,device,Arrays,Ios,Save,Device,我想知道如何保存iOS应用程序的阵列。我使用了一种方法,但它只保存在我的iPodtouch上。我在iPad上进行了测试,但没有成功 我需要的是在任何设备上保存我的应用程序阵列的代码 有人能帮我吗 代码如下: myAppViewController.h: - (NSString *)GetApplicationDocumentsDirectory; - (void)applicationWillTerminate:(NSNotification *)notification; myAppView

我想知道如何保存iOS应用程序的阵列。我使用了一种方法,但它只保存在我的iPodtouch上。我在iPad上进行了测试,但没有成功

我需要的是在任何设备上保存我的应用程序阵列的代码

有人能帮我吗

代码如下:

myAppViewController.h:

- (NSString *)GetApplicationDocumentsDirectory;
- (void)applicationWillTerminate:(NSNotification *)notification;
myAppViewController.m:

-(NSString*) GetApplicationDocumentsDirectory {
    static NSString* documentsDirectory = nil;
    if (documentsDirectory == nil) {
        documentsDirectory = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                                                   NSUserDomainMask,
                                                                   YES)
                               objectAtIndex:0] retain];

    }
    NSString *fullFileName = [NSString stringWithFormat:@"%@/TarefasSalvas.plist", documentsDirectory];
    return fullFileName;
}

- (void)applicationWillTerminate:(NSNotification *)notification{
    NSMutableArray *array = [[NSMutableArray alloc] init];
                             [array addObject:lisTitulos];
                             [array addObject:lisImagens];
                             [array addObject:lisData];
                             [array addObject:lisDetalhes];

    [array writeToFile:[self GetApplicationDocumentsDirectory] atomically:YES]; 
}


- (void)viewDidLoad {
    [super viewDidLoad];

    NSString *filePath = [self GetApplicationDocumentsDirectory];
    //if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
        NSMutableArray *array = [[NSMutableArray alloc] initWithContentsOfFile:filePath];
    if (array != nil){
        lisTitulos = [array objectAtIndex:0];
        lisImagens = [array objectAtIndex:1];
        lisData = [array objectAtIndex:2];
        lisDetalhes = [array objectAtIndex:3];
    }
    else {
        NSDate *date = [NSDate date];
        NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
        [dateFormat setLocale:[NSLocale currentLocale]];
        [dateFormat setDateFormat:@"dd/MM/YYYY"];
        NSString *dateNow = [dateFormat stringFromDate:date];

        lisTitulos = [[NSMutableArray alloc] initWithObjects:@"Titulo",nil];
        lisImagens = [[NSMutableArray alloc] initWithObjects:@"0.png",nil];
        lisData = [[NSMutableArray alloc] initWithObjects:dateNow,nil];
        lisDetalhes = [[NSMutableArray alloc] initWithObjects:@"",nil];
    }

    UIApplication *app = [UIApplication sharedApplication];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillTerminate:) name:UIApplicationWillTerminateNotification object:app];
}

谢谢

您可能只是将应用程序发送到后台,而没有终止它们。在这种情况下,applicationWillTerminate:将不会被调用。这似乎是可能的原因,因为代码的其余部分看起来很好

您的GetApplicationDocumentsDirectory的名称似乎有点奇怪,因为它获取了存储数组的文件的路径。除此之外,

NSString *fullFileName = [NSString stringWithFormat:@"%@/TarefasSalvas.plist", documentsDirectory];
不是获取文件路径的正确方法。您应该像这样在documentsDirectory上使用StringByAppendingPathComponent:方法

NSString *fullFileName = [documentsDirectory stringByAppendingPathComponent:@"TarefasSalvas.plist"];
将fullFileName声明为静态变量而不是documentsDirectory也是有意义的。

谢谢@Deepak。 在你告诉我调试时发出日志警报的提示后,我注意到iPad正在关闭应用程序,然后应用程序无法调用应用程序WillTerminate:方法,正如你前面提到的。 因此,我解决了将代码更改为:

- (void)applicationWillTerminate:(NSNotification *)notification{
    [self SavingStatus];
}

-(void)SavingStatus {
    NSMutableArray *array = [[NSMutableArray alloc] init];
    [array addObject:lisTitulos];
    [array addObject:lisImagens];
    [array addObject:lisData];
    [array addObject:lisDetalhes];

    [array writeToFile:[self GetApplicationDocumentsDirectory] atomically:YES]; 
}
如您所见,我创建了一个在applicationWillTerminate:method上调用的方法,每次应用程序重新加载表数据时:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

  ...

    [self SavingStatus];

    return cell;

}
通过这种方式,即使您的设备在应用程序正常关闭之前将其关闭,信息仍将被保存=D

再次感谢@Deepak
还有所有回复我的人。

你能告诉我们,到目前为止,你用一些代码和一个例子做了些什么吗?你的iOS应用程序数组是什么?你到底想保存什么,在什么地方、什么时候、用什么测试来确定你的尝试是否有效?谢谢你的回复,但不幸的是,它仍然无法在ipad上保存=/你确定该方法被调用了吗?And writeToFile:atomically:方法在失败时返回NO。你应该检查它返回的内容。我注意到,当我在iPad上运行应用程序时,当我关闭应用程序时,Xcode屏幕底部显示:GDB:数据格式化程序暂时不可用,将在继续后重试。此时调用dlopen不安全。似乎与内存问题有关。您是否尝试分析该应用程序?您是否确定是否调用了该方法以及写入是否成功?如果不是,则向applicationWillTerminate:方法添加NSLog语句。放NSLog@method打电话;并使用BOOL result=[array writeToFile:[self-getapplicationdocumentsddirectory]原子方式捕获写入操作的结果:YES];然后添加NSLog@%d,结果;直到方法的末尾。