将NSObject转换为NSData

15 iphone

我在转换NSObject成一个问题时遇到了问题NSData.我有一个继承的类NSObject.

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

NSData *dataOnObject = [NSKeyedArchiver archivedDataWithRootObject:classObject];
Run Code Online (Sandbox Code Playgroud)

但它给出了异常,说明-[classObject encodeWithCoder:]:无法识别的选择器发送到实例..

我还将对象添加到新创建的数组中

NSMutableArray *wrapperedData = [NSMutableArray arrayWithObject: classObject];
NSData *dataOnObject = [NSKeyedArchiver archivedDataWithRootObject:value];
Run Code Online (Sandbox Code Playgroud)

但是,它仍然给出例外.

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

任何帮助将不胜感激 ...

等待您的回复 ...

小智 22

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

- (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];
Run Code Online (Sandbox Code Playgroud)

和:

- (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];
Run Code Online (Sandbox Code Playgroud)


Jon*_*her 7

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


nod*_*nja 6

代替

NSData *dataOnObject = [NSKeyedArchiver archivedDataWithRootObject:classObject];
Run Code Online (Sandbox Code Playgroud)

它应该是

NSData *dataOnObject = [[NSUserDefaults standardUserDefaults] objectForKey:@"someKey"];
Run Code Online (Sandbox Code Playgroud)

但这只是用于读取已经保存的数据.如果要将对象保存为NSData,则可以:

[[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:classObject] forKey:@"someKey"];
Run Code Online (Sandbox Code Playgroud)

但那还不是全部.你的classObject必须实现NSCoding协议,并且有两个方法encodeWithCoder:和initWithCoder:因为它不是一个NS对象才能工作.

  • 当您不想要UserDefaults时,请勿使用UserDefaults.问题是关于将NSObject转换为NSData.不需要保存首选项或任何持久性. (4认同)
  • 为什么这个概念与NSUserDefaults有关 (3认同)

new*_*cct 5

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