使用头文件中声明的字符串时EXC_BAD_ACCESS

时间:2012-01-06 15:23:55

标签: iphone string exc-bad-access header-files

我在头文件中声明了一个字符串,如下所示:

@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,但根本没找到任何东西。

任何有助于解决此问题的帮助都将非常感激。

4 个答案:

答案 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代替。