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)
您需要在自定义类上实现encodeWithCoder:使用传入其中的NSCoder序列化其所有属性.如果它的属性包含更多自定义类,则它们还需要encodeWithCoder:也可以实现.
代替
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对象才能工作.
| 归档时间: |
|
| 查看次数: |
30824 次 |
| 最近记录: |