2010-06-08 32 views
16

I (propertized ve sentezlenir) üç değişkeni olan bir özel sınıf Kişi varsa:Özel sınıf için nsuserdefaults'a kaydetmenin en iyi yolu?

NSString* theName; 
float* theHeight; 
int theAge; 

Kişi örnekleri bir NSArray 'Grup' saklanır. Sadece bir grup var. Group'u NSUserDefaults'ta saklamanın ve yüklemenin en iyi yolu nedir? Hatta

+2

şamandıra ve int yasal? 'NSUserDefaults' her ikisi için de yöntemleri vardır. –

+0

Sorununuzu çözdünüz mü? Bu gönderiyi cevaplandı olarak işaretlemek için lütfen doğru cevabı işaretleyin. –

cevap

45

@Brad Smith'in cevabı tam değildir (yüzer ve int NSUserDefaults için yasal olmadığını dikkate alarak) ve bir bakıma yanlıştır.

protokolüne NSCoding uygun ve yöntemleri hem uygulamak için (bu durumda Person örneğin) sınıfınızı yapın olarak:

- (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]; 
Kullanılması şöyle NSKeyedUnarchiver NSKeyedArchiver kullanmak zorunda ve
+3

Keşke cevabınızı en üst seviyeye çıkarabilirim. Brad Smith tamamen yanıltıcıdır. Ben –

+2

Yani @BredSmith aşağı oy? Bunu başlatırken hangi kodlayıcıyı geçmeliyim? Ya da kaydederken ve okurken otomatik olarak aranır mı? – Dejell

+0

@Kailash, böylece kodlama ve kod çözme yöntemlerinin kullanımı ne yaptığı gibi – gdubs

1

sana NSUserDefaults kayıt yapma sınıfında birçok özelliklerini ve birçok sınıfları, özellikle oldukça sıkıcı encodeWithCoder ve initWithCoder uygulayan bulmak.

Bunu kütüphanedeki RMMapper (https://github.com/roomorama/RMMapper) daha kolay ve daha rahat NSUserDefaults içine özel nesne kurtarmaya yardım etmek oluşturun.

arşivlenebilecek olarak bir sınıf işaretlemek için, sadece kullanın: #import "NSObject+RMArchivable.h"

NSUserDefaults içine özel bir nesne kaydetmek için:

#import "NSUserDefaults+RMSaveCustomObject.h" 

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

özel NSUserDefaults gelen obj olsun için: Neden' değil mi

user = [defaults rm_customObjectForKey:@"SAVED_DATA"]; 
İlgili konular