首页 > 解决方案 > 可可 - 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: 方法中放置了一个断点,但它永远不会运行。我使用一些工具,发现元素成功存储在我的核心数据中,所以它的编码过程没有问题。

标签: objective-ccocoacore-data

解决方案


我修复了它,这是解决方案:

我的对象是“地址”(注意:它不是 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;

推荐阅读