Я создаю приложение, в котором мне нужно сохранять текст в нескольких представлениях в приложении при выходе из приложения. Мне также нужно иметь возможность удалить все данные только из одного из этих представлений, и при выходе из приложения возможно, что не все эти представления будут созданы.
После прочтения этого поста Я подумал, что, возможно, было бы хорошо использовать синглтон, который управляет данными моего приложения, который загружается в данные при первом запросе и сохраняет их при выходе из приложения. Затем в каждом представлении, где мне нужно сохранить данные, я могу просто установить их на синглтоне.
Я попробовал, но столкнулся с некоторыми проблемами. Сначала я не синтезировал свойства (как в посте, который я использовал в качестве руководства), но компилятор сказал мне, что мне нужно создавать геттеры и сеттеры, поэтому я и сделал. Теперь, когда мой вызов applicationWIllTerminate: gets, приложение вылетает, и консоль говорит «Программа получила сигнал:« 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";
Любая помощь будет очень признательна!