2009-11-02 17 views
14

Estoy teniendo un problema en la conversión de un NSObject en NSData. Tengo una clase que hereda NSObject.NSObject en NSData

cuando traté de convertir el objeto de esa clase en particular en NSData de la siguiente manera:

NSData *dataOnObject = [NSKeyedArchiver archivedDataWithRootObject:classObject]; 

pero le da un vistazo a excepción indicando que -[classObject encodeWithCoder:]: selector no reconocido enviado a la instancia ..

También he añadido el objeto para una matriz recién creada como

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

Pero aún así, está dando una excepción.

por eso es necesario para extraer los bytes del objeto classObject.

Cualquier ayuda sería muy apreciada ...

la espera de su respuesta ...

Respuesta

5

que pueda objetos sólo de archivos compatibles con el protocolo NSCoding

7

es necesario implementar encodeWithCoder: en su clase personalizada, serializando todos sus atributos usando el NSCoder pasado a este. Si sus atributos incluyen más clases personalizadas, necesitarán encodeWithCoder: implementación también.

6

En lugar de

NSData *dataOnObject = [NSKeyedArchiver archivedDataWithRootObject:classObject]; 

debe ser

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

Pero eso es sólo para la lectura de datos en la que ya se ha guardado. Si desea guardar un objeto como NSData, entonces tiene esto:

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

Pero eso no es todo. Tu classObject tiene que implementar el protocolo NSCoding y tener los dos métodos encodeWithCoder: y initWithCoder: ya que no es un objeto NS para que funcione.

+0

¿Por qué esto se bajó? lol. –

+1

(No te he rechazado) Tal vez sea porque NSKeyedUnarchiver no se asigna a NSUserDefaults ... – CodaFi

+3

Por qué este concepto está involucrado con NSUserDefaults –

21

Debe implementar para su propio objeto, como:

- (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]; 

y:

- (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

Esta es una ejemplo de objeto personalizado convertido a NSData (por lo que se puede guardar en los valores predeterminados del usuario)

Cree los siguientes archivos:

Catálogo.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 

archivos Por último en su controlador incluir un encabezado de

#import "Catalog.h" 

y añade este código para utilizar el objeto (en este caso im ahorro en valores predeterminados del usuario)

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

NOTA: en esta línea de código es donde está tomando el paso de datos real lugar

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

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

En caso de que desee obtener su objetivo de volver de NSData

NSData *nsData = [[NSUserDefaults standardUserDefaults] objectForKey:@"keyName"]; 
//unarchiving object to nsdata 
Catalog *selectedCatalog = [NSKeyedUnarchiver unarchiveObjectWithData: nsData]; 

Espero que esto ayude!