【问题标题】:cocoa - unarchivedObjectOfClass does not call initWithCoder可可 - unarchivedObjectOfClass 不调用 initWithCoder
【发布时间】:2018-11-06 12:34:02
【问题描述】:

我正在使用 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-c cocoa core-data


    【解决方案1】:

    我修好了,解决方法如下:

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

    Archive.h

    @property (nonatomic, strong) Address *address;
    

    Archive.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);
    
            }
    

    UserDBO.h

    @property (nonatomic, strong) NSData *address;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多