Iphone 将NSObject转换为NSData

Iphone 将NSObject转换为NSData,iphone,Iphone,我在将NSObject转换为NSData时遇到问题。我有一个类继承了NSObject 当我试图将该特定类的对象转换为NSData时,如下所示: NSData *dataOnObject = [NSKeyedArchiver archivedDataWithRootObject:classObject]; 但它给出了一个异常,声明-[classObject encodeWithCoder::未识别的选择器被发送到实例 我还将该对象添加到新创建的数组中,如下所示 NSMutableArray *w

我在将
NSObject
转换为
NSData
时遇到问题。我有一个类继承了
NSObject

当我试图将该特定类的对象转换为
NSData
时,如下所示:

NSData *dataOnObject = [NSKeyedArchiver archivedDataWithRootObject:classObject];
但它给出了一个异常,声明
-[classObject encodeWithCoder::
未识别的选择器被发送到实例

我还将该对象添加到新创建的数组中,如下所示

NSMutableArray *wrapperedData = [NSMutableArray arrayWithObject: classObject];
NSData *dataOnObject = [NSKeyedArchiver archivedDataWithRootObject:value];
但它仍然是一个例外

所以我需要从对象
classObject
中提取字节

任何帮助都将不胜感激


等待您的答复…

您只能归档支持
NSCoding
协议的对象。

您需要在自定义类上实现encodeWithCoder:,使用传入的NSCoder序列化其所有属性。如果它的属性包含更多的自定义类,它们也需要encodeWithCoder:实现

而不是

NSData *dataOnObject = [NSKeyedArchiver archivedDataWithRootObject:classObject];
应该是

NSData *dataOnObject = [[NSUserDefaults standardUserDefaults] objectForKey:@"someKey"];
但这只是为了读取已经保存的数据。如果要将对象另存为NSData,则需要:

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

但这还不是全部。您的类对象必须实现NSCoding协议,并具有encodeWithCoder:和initWithCoder:两种方法,因为它不是NS对象才能工作。

您可以使用NSCoding协议将任何对象转换为NSData

您可以在此处找到执行此操作的示例代码:

您必须为自己的对象实现,例如:

- (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];
以及:


这是一个将自定义对象转换为NSData的示例(因此可以将其保存为用户默认值)

创建以下文件:

目录.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
并添加此代码以使用对象(在本例中,我将保存为用户默认值)

注意:在这行代码中,实际的数据传递发生在这里 以防您想从NSData取回您的对象

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

希望这有帮助

(我没有投你反对票)也许是因为NSKeyedUnachiver没有映射到NSUserDefaults…为什么NSUserDefaults涉及到这个概念?当你不需要UserDefaults时,不要使用UserDefaults。问题是如何将NSObject转换为NSData。不需要保存首选项或任何持久性。
#import "Catalog.h"
            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 *nsData = [[NSUserDefaults standardUserDefaults] objectForKey:@"keyName"];
//unarchiving object to nsdata
Catalog *selectedCatalog = [NSKeyedUnarchiver unarchiveObjectWithData: nsData];