如何从iPhone应用程序的多个视图中保存数据?

时间:2010-04-10 03:59:39

标签: iphone objective-c singleton save plist

我正在创建一个应用,我需要在应用退出时在应用中的多个视图中保存文本。我还需要能够从其中一个视图中删除所有数据,当应用程序退出时,可能还没有创建所有这些视图。

在阅读this post后,我想也许最好使用管理我的应用数据的单例,这些数据在首次请求时加载到数据中,并在应用退出时保存。然后在我需要保存数据的每个视图中,我可以在单例上设置它。

我试了一下,但遇到了一些问题。起初我没有合成属性(如我作为指南使用的帖子),但编译器告诉我,我需要制作getter和setter,所以我做了。现在,当我的applicationWIllTerminate:调用应用程序崩溃并且控制台显示“程序收到信号:”EXC_BAD_ACCESS“。kill quit”。

有人能够告诉我我做错了什么,或建议更好的方法来保存数据吗?

// SavedData.h

#import <Foundation/Foundation.h>

#define kFileName @"appData.plist"

@interface SavedData : NSObject {
    NSString *information;
    NSString *name;
    NSString *email;
    NSString *phone;
    NSString *mobile;
}

@property(assign) NSString *information;
@property(assign) NSString *name;
@property(assign) NSString *email;
@property(assign) NSString *phone;
@property(assign) NSString *mobile;

+ (SavedData *)singleton;

+ (NSString *)dataFilePath;
+ (void)applicationWillTerminate:(NSNotification *)notification;
@end

// SavedData.m

#import "SavedData.h"

@implementation SavedData

@synthesize information;
@synthesize name;
@synthesize email;
@synthesize phone;
@synthesize mobile;

static SavedData * SavedData_Singleton = nil;

+ (SavedData *)singleton{

    if (nil == SavedData_Singleton){
        SavedData_Singleton = [[SavedData_Singleton alloc] init];

        NSString *filePath = [self dataFilePath];
        if([[NSFileManager defaultManager] fileExistsAtPath:filePath]){
            NSMutableArray * array = [[NSMutableArray alloc] initWithContentsOfFile:filePath];
            information = [array objectAtIndex:0];
            name = [array objectAtIndex:1];
            email = [array objectAtIndex:2];
            phone = [array objectAtIndex:3];
            mobile = [array objectAtIndex:4];           
            [array release];
        }
        UIApplication *app = [UIApplication sharedApplication];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillTerminate:) name:UIApplicationWillTerminateNotification object:app]; 
    }
    return SavedData_Singleton;
}

+ (NSString *)dataFilePath{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *DocumentsDirectory = [paths objectAtIndex:0];
    return [DocumentsDirectory stringByAppendingPathComponent:kFileName];
}

+ (void)applicationWillTerminate:(NSNotification *)notification{
    NSLog(@"Application will terminate received");
    NSMutableArray *array = [[NSMutableArray alloc] init];
    [array addObject:information];
    [array addObject:name];
    [array addObject:email];
    [array addObject:phone];
    [array addObject:mobile];
    [array writeToFile:[self dataFilePath] atomically:YES];
    [array release];
}

@end

然后,当我想使用它时,我做

myLabel.text = [SavedData singleton].information;

当我改变字段时

[SavedData singleton].information = @"my string";

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:2)

您可能希望将属性更改为(保留)而不是分配。

您可能希望获得我使用的singleton header file。这对我来说非常好。

可能发生的事情是从文件中加载数组,并将其分配给属性。但它正在自动释放,因此它不再存在。因此,当您稍后尝试访问内存时,它会崩溃。

进一步阅读有关内存管理的内容:http://www.cocoadev.com/index.pl?MemoryManagement