1

我有一个符合NSSecureCoding. 我正在尝试对其数据进行编码,将其写入文件并对其进行解码。该类包含一个数组,我在编码之前int将其转换为NSArray填充元素。NSNumber当我解码数组时,decodeObjectForKey返回nil. 此外,当我将编码数组写入文件时,plist 看起来不正确。例如,它的结构中没有“key_for_ns_array”键。

这是我的代码的简化版本:

@interface c_my_data_wrapper : NSObject <NSSecureCoding>
@property (assign, nonatomic) struct s_my_data my_data; // the array exists as an int[] in here
@end
@implementation c_my_data_wrapper

- (void)encodeWithCoder:(NSCoder *)encoder
{
    NSMutableArray *ns_array= [NSMutableArray array];
    int_array_to_ns_array(self.my_data.my_int_array, count, ns_array);

    [encoder encodeObject:ns_array forKey:@"key_for_ns_array"];
}

- (instancetype)initWithCoder:(NSCoder *)decoder
{
    self= [self init];
    
    if (self)
    {
        // this returns nil
        NSArray *ns_array= [decoder decodeObjectForKey:@"key_for_ns_array"];
    }

    return self;
}

@end
c_secure_storage_data_wrapper* g_my_data_wrapper= nil; // allocation not shown
void store_data(struct s_storage_data_secure *new_data)
{
    g_my_data_wrapper.my_data= *new_data;

    NSData *encoded_data=
        [NSKeyedArchiver archivedDataWithRootObject:g_my_data_wrapper
                              requiringSecureCoding:YES
                                              error:nil];

    // then I write the encoded data to a file
}
void load_data(void)
{
    NSData *decoded_data= [NSData dataWithContentsOfURL:my_url];

    g_my_data_wrapper=
        [NSKeyedUnarchiver unarchivedObjectOfClass:[c_my_data_wrapper class]
                                          fromData:decoded_data
                                             error:nil];
}
void int_array_to_ns_array(
    int *int_array,
    int count,
    NSMutableArray *out_ns_array)
{
    for (int index= 0; index < count; ++index)
    {
        [out_ns_array addObject:[NSNumber numberWithInt:int_array[index]]];
    }
}

如果您对整个 int 数组到 ns 数组的转换感到好奇……那是因为我更喜欢用 C++ 编写。我对objective-c不是很有经验,所以我只在需要弥合我的游戏和iOS之间的差距时才写它。在这种情况下, s_my_data 是两者之间共享的类型。

4

1 回答 1

0

一个问题,可能问题,是你声称你的类是NSSecureCodeing- 兼容的,但你仍然打电话-decodeObjectForKey:而不是-decodeObjectOfClass:forKey:

NSArray *ns_array= [decoder decodeObjectForKey:@"key_for_ns_array"];

那不安全。关键NSSecureCoding是你告诉解码器你期望返回什么类型,这就是什么-decodeObjectOfClass:forKey:

于 2021-05-26T16:10:58.600 回答