Преобразование NSObject в NSData

У меня возникла проблема при преобразовании NSObject в NSData. У меня есть класс, который наследует NSObject.

Когда я попытался преобразовать объект этого конкретного класса в NSData следующим образом:

NSData *dataOnObject = [NSKeyedArchiver archivedDataWithRootObject:classObject];

но он выдает исключение, заявляя, что -[classObject encodeWithCoder:]: непризнанный селектор отправлен экземпляру.

Я также добавил объект к вновь созданному массиву как

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

Но тем не менее, это исключение.

Поэтому мне нужно извлечь байты из объекта classObject.

Любая помощь будет принята с благодарностью...

ждет вашего ответа...

Ответ 1

Вы должны реализовать для своего собственного объекта, например:

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

и

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

Ответ 2

Вам необходимо внедрить encodeWithCoder: в свой пользовательский класс, сериализуя все его атрибуты, используя переданный в него NSCoder. Если его атрибуты включают в себя дополнительные пользовательские классы, им также понадобится encodeWithCoder: реализация.

Ответ 3

Вместо

NSData *dataOnObject = [NSKeyedArchiver archivedDataWithRootObject:classObject];

он должен быть

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

Но это просто для чтения данных, которые уже были сохранены. Если вы хотите сохранить объект в виде NSData, вы получите следующее:

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

Но это не все. Ваш classObject должен реализовать протокол NSCoding и использовать два метода encodeWithCoder: и initWithCoder: поскольку он не является объектом NS, чтобы он работал.

Ответ 4

вы можете архивировать объекты, поддерживающие протокол NSCoding

Ответ 6

Это пример настраиваемого объекта, преобразованного в NSData (чтобы его можно было сохранить в пользовательские значения по умолчанию)

Создайте следующие файлы:

Catalog.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

Наконец, в вашем контроллере есть файлы заголовков

#import "Catalog.h"

И добавьте этот код, чтобы использовать свой объект (в этом случае im сохраняет в пользовательские настройки по умолчанию)

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

ПРИМЕЧАНИЕ: в этой строке кода происходит фактическая передача данных

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

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

Если вы хотите вернуть свой объект из NSData​​p >

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

Надеюсь, это поможет!