可可粉-unarchivedObjectOfClass不调用initWithCoder

时间:2018-11-06 12:34:03

标签: objective-c cocoa core-data

我正在使用Objective-C开发macOS应用。

我试图将NSArray对象保存在Core Data中。我写

- (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:方法中放置了一个断点,并且它永远不会运行。我使用了一些工具,发现元素已成功存储在核心数据中,因此其编码过程没有问题。

1 个答案:

答案 0 :(得分:0)

我已修复它,这是解决方法:

我的对象是“地址”(注意:它不是NSArray)

地址.h

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

}

地址.m

@property (nonatomic, strong) Address *address;

Archive.h

UserDBO *userDBO = [[UserDBO alloc] init];

Archive.m

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

        }

//取消存档

@property (nonatomic, strong) NSData *address;

UserDBO.h

def first_rpt(M):  
   for i in range(1, len(M)):    
      M[i]=M[0]    
   return