2009-11-02 19 views
14

NSObject'un NSData'a dönüştürülmesinde bir sorun yaşıyorum. NSObject'u devralan bir dersim var. şöyle ı NSData içine o belirli sınıfın nesnesini dönüştürmek için çalıştıBir NSObject öğesinin NSData'ya dönüştürülmesi

:

NSData *dataOnObject = [NSKeyedArchiver archivedDataWithRootObject:classObject]; 

ama -[classObject encodeWithCoder:]: tanınmayan seçici örneğine gönderilen belirten istisna verir ..

Ben de eklemiş Yeni oluşturulmuş bir dizinin nesnesi,

NSMutableArray *wrapperedData = [NSMutableArray arrayWithObject: classObject]; 
NSData *dataOnObject = [NSKeyedArchiver archivedDataWithRootObject:value]; 

Ancak yine de, bunun istisnasını veriyor. Bu nedenle, classObject nesnesindeki baytları ayıklamam gerekir.

Herhangi bir yardım büyük takdir

...

Cevabınız için bekleyen ...

cevap

7

Sen encodeWithCoder uygulamak gerekir NSCoding protokolünü destekleyen sadece arşiv nesneler: sitenizde, NSCoder kullanarak tüm özelliklerini serileştiren özel sınıf. Nitelikleri daha fazla özel sınıf içeriyorsa, kodlamaWithCoder'a da gereksinim duyarlar: uygulama. Bunun yerine

NSData *dataOnObject = [NSKeyedArchiver archivedDataWithRootObject:classObject]; 

ait

6

o

NSData *dataOnObject = [[NSUserDefaults standardUserDefaults] objectForKey:@"someKey"]; 

olmalıdır Ama bu zaten kaydedildi oluyor o okuma verileri için sadece bu.

[[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:classObject] forKey:@"someKey"]; 

Ama hepsi bu değil: Eğer NSData olarak bir nesneyi kaydetmek istiyorsanız o zaman bu var. ClassObject'iniz NSCoding protokolünü uygulamak zorundadır ve iki yöntemi encodeWithCoder: ve initWithCoder: 'ın çalışması için bir NS nesnesi olmadığı için.

+0

Neden bu durum reddedildi? lol. –

+1

(Ben sizi reddetmedim) Belki de NSKeyedUnarchiver'ın NSUserDefaults ile eşleşmiyor olması ... – CodaFi

+3

Bu kavram neden NSUserDefaults –

21
Aşağıdaki gibi kendi nesne için uygulaması gereken

:

- (void)encodeWithCoder:(NSCoder *)aCoder 
{ 
    [aCoder encodeObject:self.name forKey:@"name"]; 
    [aCoder encodeInt:self.age forKey:@"age"]; 
    [aCoder encodeObject:self.email forKey:@"email"]; 
    [aCoder encodeObject:self.password forKey:@"password"]; 
} 
BOOL success = [NSKeyedArchiver archiveRootObject:person toFile:archiveFilePath]; 

ve:

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    if (self = [super init]) { 
     self.name = [aDecoder decodeObjectForKey:@"name"]; 
     self.age = [aDecoder decodeIntForKey:@"age"]; 
     self.email = [aDecoder decodeObjectForKey:@"email"]; 
     self.password = [aDecoder decodeObjectForKey:@"password"]; 
    } 
    return self; 
} 
Person *unarchivePerson = [NSKeyedUnarchiver unarchiveObjectWithFile:archiveFilePath]; 
0

Bu bir NSData'ya dönüştürülen özel nesnenin örneği (böylece kullanıcı varsayılanlarına kaydedilebilir)

Aşağıdaki dosyaları oluşturun:

Katalog.h

@interface Catalog : NSObject 

@property (nonatomic, assign) int pk; 
@property (nonatomic, copy) NSString *catalogName; 
@property (nonatomic, copy) NSString *catalogDescription; 
@property (nonatomic, assign) int catalogEdition; 
@property (nonatomic, assign) int catalogTotalPages; 

- (void)encodeWithCoder:(NSCoder *)aCoder; 
- (id)initWithCoder:(NSCoder *)aDecoder; 

@end 

Catalog.m

#import <Foundation/Foundation.h> 
#import "Catalog.h" 

@implementation Catalog 

- (void)encodeWithCoder:(NSCoder *)aCoder { 
    [aCoder encodeObject:self.catalogName forKey:@"catalogName"]; 
    [aCoder encodeObject:self.catalogDescription forKey:@"catalogDescription"]; 
    [aCoder encodeInt:self.catalogEdition forKey:@"catalogEdition"]; 
    [aCoder encodeInt:self.catalogTotalPages forKey:@"catalogTotalPages"]; 
} 

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    if (self = [super init]) { 
     self.catalogName = [aDecoder decodeObjectForKey:@"catalogName"]; 
     self.catalogDescription = [aDecoder decodeObjectForKey:@"catalogDescription"]; 
     self.catalogEdition = [aDecoder decodeIntForKey:@"catalogEdition"]; 
     self.catalogTotalPages = [aDecoder decodeIntForKey:@"catalogTotalPages"]; 
    } 
    return self; 
} 

@end 

Nihayet denetleyicisi başlığında içerir dosyalar

#import "Catalog.h" 

Ve (kullanıcı varsayılan içine tasarrufu bu durumda im) Nesnenizi kullanmak için bu kodu ekleyin

  Catalog *catalog = [[Catalog alloc] init]; 
      catalog.catalogName = @"catalogName"; 
      catalog.catalogDescription = @"catalogName"; 
      catalog.catalogEdition = 1; 

NOT: gerçek veri geçişi Eğer bu yardımcı Hope
NSData *nsData = [[NSUserDefaults standardUserDefaults] objectForKey:@"keyName"]; 
//unarchiving object to nsdata 
Catalog *selectedCatalog = [NSKeyedUnarchiver unarchiveObjectWithData: nsData]; 

NSData

den geri nesneyi almak istiyorum durumunda yer

//archiving object to nsdata 
NSData *encodedObject = [NSKeyedArchiver archivedDataWithRootObject:catalog]; 

[[NSUserDefaults standardUserDefaults] setObject:encodedObject forKey:@"keyName"]; 
[[NSUserDefaults standardUserDefaults] synchronize]; 

nereye götürdüğünü bu kod uyumludur!

İlgili konular