Хранение пользовательских объектов в NSUserDefaults - PullRequest
0 голосов
/ 03 октября 2011

Я пытаюсь сохранить объект в NSUserDefaults, но мне это не удалось.Сценарий таков, у меня есть объект syncObject класса SyncObjct.Я реализовал следующие методы в классе SyncObject

- (NSMutableDictionary*)toDictionary;
+ (SyncObject*)getFromDictionary :(NSMutableDictionary*)dictionary;
- (id) initWithCoder: (NSCoder *)coder;
- (void) encodeWithCoder: (NSCoder *)coder;

А также класс SyncObject является классом NSCoding.Теперь класс SyncObject содержит NSMutableArray с именем jobsArray.Этот массив содержит объекты класса JobsObject.Я реализовал те же методы выше для этого класса, чтобы сделать его совместимым с кодированием.В методе toDictionary класса SyncObject я сохраняю этот массив в словаре, записывая следующую строку.

[dictionary setValue:jobsArray forKey:@"jobsArray"];

и извлекаю его в метод getFromDictionary класса SyncOject, записывая следующую строку.

    + (SyncObject*)getFromDictionary :(NSMutableDictionary*)dictionary 
{       
    NSLog(@"SyncObject:getFromDictionary");
    SyncObject *syncObject = [[SyncObject alloc] init];

    @try 
    {

        syncObject.noOfJobs = [[dictionary valueForKey:@"noOfJobs"] intValue];  
        syncObject.totalJobsPerformed = (TotalJobsPerformed*)[dictionary valueForKey:@"totalobsPerformed"];
        syncObject.jobsArray = [dictionary valueForKey:@"jobsArray"];

    }
    @catch (NSException * e) 
    {
        NSLog(@"EXCEPTION %@: %@", [e name], [e reason]);
    }
    @finally 
    {

    }

    return syncObject;
}

А также я храню syncObject в NSUserDefault, записывая следующие строки.

NSData *myEncodedObject = [NSKeyedArchiver archivedDataWithRootObject:syncObject];
[userStorage setObject:myEncodedObject forKey:SYNC_OBJECT];

Я получаю объект из NSUserDefaults, записывая следующие строки

NSData *myEncodedObject = [userStorage objectForKey: SYNC_OBJECT];
    syncObject = (SyncObject*)[NSKeyedUnarchiver unarchiveObjectWithData: myEncodedObject];

Проблема в том, что яне удалось получить jobsArray правильно.Возвращается какой-то недопустимый объект и происходит сбой приложения при попытке доступа к нему.Кто-нибудь может подсказать причину этой проблемы?

С наилучшими пожеланиями

Ответы [ 2 ]

0 голосов
/ 11 января 2018

Пользовательский класс .h

#import <Foundation/Foundation.h>

@interface Person : NSObject

@property(nonatomic, retain) NSArray *names;

@property(strong,nonatomic)NSString *name;


@end

Пользовательский класс .m

 #import "Person.h"

@implementation Person
@synthesize names;


- (void)encodeWithCoder:(NSCoder *)encoder {
    [encoder encodeObject:self.name forKey:@"name"];
}

- (id)initWithCoder:(NSCoder *)decoder {
    if((self = [super init])) {
        //decode properties, other class vars
        self.name = [decoder decodeObjectForKey:@"name"];

    }
    return self;
}


@end

Чтобы создать объект класса Person ихранить и извлекать сохраненные данные из NSUserDefaults

Хранить ваш объект:

#import "ViewController.h"
#import "Person.h"

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UITextField *textBox;

@end

NSMutableArray *arr;

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
- (IBAction)saveButton:(id)sender {
    Person *person =[Person new];
    person.name = _textBox.text;

     arr = [[NSMutableArray alloc]init];
    [arr  addObject:person];

    NSData *encodedObject = [NSKeyedArchiver archivedDataWithRootObject:arr];
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:encodedObject forKey:@"name"];
    [defaults synchronize];
}
- (IBAction)showButton:(id)sender {
    _label.text = @"";

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    NSData *storedEncodedObject = [defaults objectForKey:@"name"];
    NSArray *arrStoreObject = [NSKeyedUnarchiver unarchiveObjectWithData:storedEncodedObject];

    for (int i=0; i<arrStoreObject.count; i++)
    {
        Person *storedObject = [arrStoreObject objectAtIndex:i];

        _label.text = [NSString stringWithFormat:@"%@ %@",  _label.text , storedObject.name];

    }


}

@end
0 голосов
/ 03 октября 2011

Я считаю, что проблема в том, что NSUserDefaults не поддерживает хранение пользовательских типов объектов.

Из документации Apple при использовании -setObject: параметром значения могут быть только объекты списка свойств: NSData, NSString, NSNumber, NSDate, NSArray или NSDictionary. Для объектов NSArray и NSDictionary их содержимое должно быть объектами списка свойств.

Вы можете просмотреть оставшуюся документацию непосредственно из Справочного руководства по классу NSUserDefault от Apple .

...