C++ 安全NSUserDefaults库中的EXC_错误访问
我正在尝试使用此处找到的安全NSUserDefaults库: 尝试使用库对整数进行哈希运算时,此函数崩溃:C++ 安全NSUserDefaults库中的EXC_错误访问,c++,ios,objective-c,C++,Ios,Objective C,我正在尝试使用此处找到的安全NSUserDefaults库: 尝试使用库对整数进行哈希运算时,此函数崩溃: - (NSString *)_hashObject:(id)object { if (_secretData == nil) { // Use if statement in case asserts are disabled NSAssert(NO, @"Provide a secret before using any secure w
- (NSString *)_hashObject:(id)object
{
if (_secretData == nil)
{
// Use if statement in case asserts are disabled
NSAssert(NO, @"Provide a secret before using any secure writing or reading methods!");
return nil;
}
// Copy object to make sure it is immutable (thanks Stephen)
object = [object copy];
// Archive & hash
NSMutableData *archivedData = [[NSKeyedArchiver archivedDataWithRootObject:object] mutableCopy];
[archivedData appendData:_secretData];
if (_deviceIdentifierData != nil)
[archivedData appendData:_deviceIdentifierData];
NSString *hash = [self _hashData:archivedData];
return hash;
}
单步执行调试器后,这一行似乎是罪魁祸首:
NSMutableData *archivedData = [[NSKeyedArchiver archivedDataWithRootObject:object] mutableCopy];
此方法返回nil,并损坏对象的地址(变成0xFFFFCC)。请注意,我以前从未实际使用过NSKeyedArchiver,因此我不太了解这里的情况。整数在Objective-C中不是对象。您不能将它们传递给接受对象参数的方法
我不太清楚为什么要使用
NSKeyedArchiver
。如果您需要一个NSMutableData
,您可能希望直接使用创建一个。实际上,在将整数传递到hashObject()方法之前,它最终会转换为一个NSNumber。我尝试了[NSMutableData dataWithBytes:object length:malloc_size(object)],但仍然得到了一个nil返回值,并且object也变成了nil。不过,我决定自己编写散列比使用一个坏库更简单。