objective-c - 可可 - unarchivedObjectOfClass 不调用 initWithCoder
问题描述
我正在使用 Objective-C 开发一个 macOS 应用程序。
我试图在 Core Data 中保存一个 NSArray 对象。我写的
- (id)reverseTransformedValue:(id)value
{
return [NSKeyedUnarchiver unarchivedObjectOfClass:[NSArray class] fromData:value error:nil];
}
在继承 NSValueTransformer 的类中。
并且我的 NSArray 对象中的元素之一不是主要类型(具有称为 courseName 和 courseInfos 的属性),所以我符合这个元素的类。在这堂课上,我写道:
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [[self class] new];
if (self = [super init])
{
self.courseName = [aDecoder decodeObjectForKey:@"courseName"];
self.courseInfos = [aDecoder decodeObjectForKey:@"courseInfos"];
}
return self;
}
当我的应用程序运行时,将调用 reverseTransformedValue: 方法,并解码除我的 NSArray 对象中的特殊非主元素之外的所有元素。我在该特殊元素的类中的 initWithCoder: 方法中放置了一个断点,但它永远不会运行。我使用一些工具,发现元素成功存储在我的核心数据中,所以它的编码过程没有问题。
解决方案
我修复了它,这是解决方案:
我的对象是“地址”(注意:它不是 NSArray)
地址.h
@interface Address : NSObject <NSSecureCoding>
@property (nonatomic, strong) NSString *street;
@property (nonatomic, strong) NSString *city;
@end
地址.m
@implementation Address
- (id) initWithCoder:(NSCoder *)aDecoder
{
self = [self init];
if (self == nil)
{
return nil;
}
self.street = [aDecoder decodeObjectOfClass:[Address class] forKey:@"street"];
self.city = [aDecoder decodeObjectOfClass:[Address class]
forKey:@"city"];
return self;
}
- (void)encodeWithCoder:(NSCoder *)encoder
{
[encoder encodeObject:self.street forKey:@"street"];
[encoder encodeObject:self.city forKey:@"city"];
}
+ (BOOL)supportsSecureCoding
{
return YES;
}
存档.h
@property (nonatomic, strong) Address *address;
存档.m
UserDBO *userDBO = [[UserDBO alloc] init];
// 档案
NSError *error = nil;
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:self.address requiringSecureCoding:YES error:&error];
if(error)
{
NSLog(@"archivedDataWithRootObject: %@", error);
}
userDBO.address = data;
// 取消归档
Address *address = [NSKeyedUnarchiver unarchivedObjectOfClass:[Address class] fromData:userDBO.address error:&error];
if(error)
{
NSLog(@"unarchivedObjectOfClass: %@", error);
}
用户DBO.h
@property (nonatomic, strong) NSData *address;
推荐阅读
- c - 从 Int 10h/AX=4F00h 检索 VESA 视频模式列表
- swift - 如何用 CLLocationDegrees 解决这个问题?
- java - 通过在 java 中设置 cookie 进行身份验证,在浏览器中打开网页
- email - 邮件客户端发件人图片
- ios - 应用旋转为横向和纵向,但不会倒置旋转
- codeblocks - code::blocks 不会将我的设置保存为默认设置
- r - 组合两个相同/不同名称的数据框
- java - 在 java play scheduler 任务中注入一个类实例
- ballerina - 芭蕾舞演员的运行时间问题
- c# - 继承 - 实例化基类构造函数所需的派生类