我在头文件中声明了一个字符串,如下所示:
@property (nonatomic, retain) NSString *resultOfHash;
我这样调用我的getHash方法:
NSString *hash = [self getHash];
我的getHash方法是:
-(NSString *) getHash
{
//Get username form Keychain
KeychainItemWrapper *keyChain = [[KeychainItemWrapper alloc] initWithIdentifier:KeyChainName accessGroup:nil];
username = [keyChain objectForKey:(__bridge id)kSecAttrAccount];
//get token from NSUserDefauls
NSString *token = [[NSUserDefaults standardUserDefaults]objectForKey:@"Token"];
NSString *toHash = [[username stringByAppendingString:HashExtra] stringByAppendingString:token];
const char *s = [toHash cStringUsingEncoding:NSASCIIStringEncoding];
NSData *keyData = [NSData dataWithBytes:s length:strlen(s)];
uint8_t digest[CC_SHA1_DIGEST_LENGTH] = {0};
CC_SHA512(keyData.bytes, keyData.length, digest);
NSData *out = [NSData dataWithBytes:digest length:CC_SHA1_DIGEST_LENGTH];
//convert to string
resultOfHash = [out description];
//App crashed out above
// get rid of unwanted characters
resultOfHash = [resultOfHash stringByReplacingOccurrencesOfString:@" " withString:@""];
resultOfHash = [resultOfHash stringByReplacingOccurrencesOfString:@"<" withString:@""];
resultOfHash = [resultOfHash stringByReplacingOccurrencesOfString:@">" withString:@""];
//log to make sure it works
NSLog(@"hash is: %@", resultOfHash);
return resultOfHash;
}
我的代码崩溃了:ResultOfHash = [out description];但我不确定为什么。
当我使用局部变量时,转换工作正常,但我无法从getHash方法返回局部变量。例如:
替换ResultOfHash = [out description];
带
NSString *local = [out description];
return local;
并且转换工作正常,当我逐行调试时,调试器将转到我的方法的结束括号,然后产生EXC_BAD_ACCESS错误。
我尝试过运行NSZombie,但根本没找到任何东西。
任何有助于解决此问题的帮助都将非常感激。
答案 0 :(得分:1)
看看the answer in this question。尝试使用
转换为NSString
[NSString *local = [[[NSString alloc] initWithData:out encoding:NSASCIIStringEncoding];
我没有使用此编码测试此代码,但它与我已经使用的类似。
更新 -
我更正了上面代码中的错误。我以某种方式将方法签名留在了分散注意力的副本和粘贴中。
答案 1 :(得分:0)
因为out
没有获得而导致崩溃。你应该添加retain:
resultOfHash = [[out description] retain];
或使用保留属性:
self.resultOfHash = [out description];
检查一下,应该可行。
答案 2 :(得分:0)
您可能需要使用NSMutableString
。
答案 3 :(得分:0)
我认为问题在于:
uint8_t digest[CC_SHA1_DIGEST_LENGTH] = {0};
CC_SHA512(keyData.bytes, keyData.length, digest);
NSData *out = [NSData dataWithBytes:digest length:CC_SHA1_DIGEST_LENGTH];
您正在使用CC_SHA512
,但只分配大小为CC_SHA1_DIGEST_LENGTH
的数组,该数组较小且会导致缓冲区溢出。
要更正此问题,您应该使用CC_SHA512_DIGEST_LENGTH
代替。