2010-06-08 2 views
16

Если у меня есть пользовательский класс Person, который имеет три переменные (которые propertized и синтезированные):Лучший способ сохранить nsuserdefaults для пользовательского класса?

NSString* theName; 
float* theHeight; 
int theAge; 

экземпляры Person хранятся в NSArray «Group». Существует только одна группа. Каков наилучший способ хранения и загрузки группы в NSUserDefaults? (с учетом того, что float и int не являются законными для NSUserDefaults)

+2

Почему Арен» t float и int legal? У NSUserDefaults есть методы для обоих. –

+0

Вы решили проблему? Пожалуйста, отметьте правильный ответ, чтобы отметить это сообщение как ответ. –

ответ

45

@ Ответ Брэда Смита не является полным и даже является некорректным в некотором смысле. Мы должны использовать NSKeyedArchiver и NSKeyedUnarchiver следующим образом:

Сделайте свой класс (например, в данном случае Person) в соответствии с протоколом NSCoding и реализовать как методы, как:

- (id)initWithCoder:(NSCoder *)decoder { 
    self = [super init]; 
    if(self) { 
     self.name = [decoder decodeObjectForKey:<key_for_property_name>]; 
     // as height is a pointer 
     *self.height = [decoder decodeFloatForKey:<key_for_property_height>]; 
     self.age = [decoder decodeIntForKey:<key_for_property_age>]; 
    } 
    return self; 
} 

- (void)encodeWithCoder:(NSCoder *)encoder { 
    [encoder encodeObject:self.name forKey:<key_for_property_name>]; 
    //as height is a pointer 
    [encoder encodeFloat:*self.height forKey:<key_for_property_height>] 
    [encoder encodeInt:self.age forKey:<key_for_property_age>]; 
} 

Использование NSUserDefaults

// Write to NSUserDefaults 
NSData *archivedObject = [NSKeyedArchiver archivedDataWithRootObject:<your_class_object>]; 
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
[defaults setObject:archivedObject forKey:<key_for_archived_object>]; 
[defaults synchronize]; 

// Read from NSUserDefaults 
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
NSData *archivedObject = [defaults objectForKey:<key_for_archived_object>]; 
<your_class> *obj = (<your_class> *)[NSKeyedUnarchiver unarchiveObjectWithData:archivedObject]; 
+3

Хотел бы я подправить свой ответ на верх. Брэд Смит полностью вводит в заблуждение. –

+2

Итак, проголосовать @BredSmith, как я сделал – Dejell

+0

@ Kailash, так что же использовать методы кодирования и декодирования? Какой кодировщик следует передать при его создании? Или это автоматически вызывается при сохранении и чтении? – gdubs

1

Я нахожу реализацию encodeWithCoder и initWithCoder довольно скучным, особенно если у вас есть много атрибутов в вашем классе и многие классы для сохранения в NSUserDefaults.

Я создаю библиотеку RMMapper (https://github.com/roomorama/RMMapper), чтобы упростить и упростить сохранение пользовательского объекта в NSUserDefaults.

Чтобы пометить класс как долгосрочного хранения, просто используйте: #import "NSObject+RMArchivable.h"

Чтобы сохранить пользовательский объект в NSUserDefaults:

#import "NSUserDefaults+RMSaveCustomObject.h" 

NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; 
[defaults rm_setCustomObject:user forKey:@"SAVED_DATA"]; 

Чтобы получить заказ OBJ из NSUserDefaults:

user = [defaults rm_customObjectForKey:@"SAVED_DATA"]; 
Смежные вопросы