我正在创建一个应用,我需要在应用退出时在应用中的多个视图中保存文本。我还需要能够从其中一个视图中删除所有数据,当应用程序退出时,可能还没有创建所有这些视图。
在阅读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";
非常感谢任何帮助!
答案 0 :(得分:2)
您可能希望将属性更改为(保留)而不是分配。
您可能希望获得我使用的singleton header file。这对我来说非常好。
可能发生的事情是从文件中加载数组,并将其分配给属性。但它正在自动释放,因此它不再存在。因此,当您稍后尝试访问内存时,它会崩溃。
进一步阅读有关内存管理的内容:http://www.cocoadev.com/index.pl?MemoryManagement