首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可可- unarchivedObjectOfClass不叫initWithCoder

可可- unarchivedObjectOfClass不叫initWithCoder
EN

Stack Overflow用户
提问于 2018-11-06 12:34:02
回答 1查看 1.2K关注 0票数 0

我正在使用objective开发一个macOS应用程序。

我试图在核心数据中保存一个NSArray对象。我写

代码语言:javascript
复制
- (id)reverseTransformedValue:(id)value
{
  return [NSKeyedUnarchiver unarchivedObjectOfClass:[NSArray class] fromData:value error:nil];
}

在继承NSValueTransformer的类中。

而且我的NSArray对象中的一个元素不是主类型的(它具有名为courseName和courseInfos的属性),所以我在这个元素的类中进行了验证。在这节课上,我写道:

代码语言:javascript
复制
- (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:方法中放置了一个断点,它从未运行过。我使用了一些工具,发现元素成功地存储在我的核心数据中,因此它的编码过程没有问题。

EN

回答 1

Stack Overflow用户

发布于 2019-01-20 03:12:48

我把它修好了,这是解决办法:

我的对象是'Address‘(注意:它不是NSArray)

Address.h

代码语言:javascript
复制
@interface Address : NSObject <NSSecureCoding>

@property (nonatomic, strong) NSString *street;

@property (nonatomic, strong) NSString *city;

@end

Address.m

代码语言:javascript
复制
@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

代码语言:javascript
复制
@property (nonatomic, strong) Address *address;

Archive.m

代码语言:javascript
复制
UserDBO *userDBO = [[UserDBO alloc] init];

//档案

代码语言:javascript
复制
NSError *error = nil;

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:self.address requiringSecureCoding:YES error:&error];

    if(error) 
    {

        NSLog(@"archivedDataWithRootObject: %@", error);

    }

userDBO.address = data; 

// UnArchive

代码语言:javascript
复制
Address *address = [NSKeyedUnarchiver unarchivedObjectOfClass:[Address class] fromData:userDBO.address error:&error];

        if(error) 
       {

            NSLog(@"unarchivedObjectOfClass: %@", error);

        }

UserDBO.h

代码语言:javascript
复制
@property (nonatomic, strong) NSData *address;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53172018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档