user::8104d1af-6132-490f-9cc0-23a30c754b7e

보통 Objective-C 에서 모델을 구성하고 KeyChain을 저장할때 NSObject로 두고 decoder, encoder 메서드로 복원 처리를 한다.

@interface Model : NSObject<NSSecureCoding>

@property (nonatomic,strong,nullable) NSMutableArray*list;

@end


@implementation Model
.
.
.

- (id)initWithCoder:(NSCoder *)decoder {

if((self = [super init])) {
self.list = [decoder decodeObjectForKey:@"list"];
if (!(self.list && !self.list.isEmpty)) {
self.list = [[NSMutableArray alloc] init];
}
}
return self;
}
.
.
.

@end

단순히 Key-Value일 경우에는 위와 같은 방식으로 저장을 하면 되지만
위의 상황에서 array안에 다른 Custom Model이 들어가있는 상태에서 저장을 하고 decoder를 실행하면 에러가 뜬다.

그런 경우에는 위의 set 하는 부분인 decodeObjectForKey 가 아닌 decodeObjectOfClasses:forKey:를 써야한다.

//1. 하위 오브젝트에서 사용되는 Class들을 Array에 추가한다.
NSArray *classList = @[[Submodel Class],[Submodel2 class]];
//2. NSSet 에 위의 Array를 담은 변수를 선언
NSSet *classesSet = [NSSet setWithArray:classList];
self.list = [decoder decodeObjectOfClasses:set forKey:@"list"];

그럼 self.list안의 내용이 정상적으로 나온다.