Is there a reason that given a class that implements NSCoding that the implementation of copyWithZone: shouldn't be implemented using this pattern:
-(instancetype)copyWithZone:(NSZone *)zone{
return [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:self]];
}