Как сохранить данные из нескольких просмотров приложения для iPhone? - PullRequest
1 голос
/ 10 апреля 2010

Я создаю приложение, в котором мне нужно сохранять текст в нескольких представлениях в приложении при выходе из приложения. Мне также нужно иметь возможность удалить все данные только из одного из этих представлений, и при выходе из приложения возможно, что не все эти представления будут созданы.

После прочтения этого поста Я подумал, что, возможно, было бы хорошо использовать синглтон, который управляет данными моего приложения, который загружается в данные при первом запросе и сохраняет их при выходе из приложения. Затем в каждом представлении, где мне нужно сохранить данные, я могу просто установить их на синглтоне.

Я попробовал, но столкнулся с некоторыми проблемами. Сначала я не синтезировал свойства (как в посте, который я использовал в качестве руководства), но компилятор сказал мне, что мне нужно создавать геттеры и сеттеры, поэтому я и сделал. Теперь, когда мой вызов 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";

Любая помощь будет очень признательна!

1 Ответ

2 голосов
/ 10 апреля 2010

Возможно, вы захотите изменить свои свойства, чтобы они были (сохранены) вместо присваивания.

Возможно, вы захотите получить файл однотонного заголовка Я использую.Это очень приятно для меня.

Вероятно, что вы загружаете свой массив из файла и присваиваете его свойству.Но он выпускается автоматически, и поэтому его больше не существует.Поэтому при попытке доступа к памяти позже происходит сбой.

Дополнительная информация по управлению памятью: http://www.cocoadev.com/index.pl?MemoryManagement

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...