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