【问题标题】:EXC_BAD_ACCESS when using string declared in header file使用头文件中声明的字符串时的 EXC_BAD_ACCESS
【发布时间】:2012-02-04 07:37:10
【问题描述】:

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

@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,但什么也没找到。

如果能帮助您解决这个问题,我们将不胜感激。

【问题讨论】:

  • 你有没有合成字符串resultOfHash???

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


【解决方案1】:

看看the answer in this question。尝试使用

转换为NSString
[NSString *local = [[[NSString alloc] initWithData:out encoding:NSASCIIStringEncoding]; 

我没有用这种编码测试过这段代码,但它与我已经使用过的代码相似。

更新 -

我更正了上面代码中的一个错误。我不知何故将方法签名留在了分心的复制和粘贴中。

【讨论】:

  • 感谢 Draco 指出这一点。我不知道使用 NSData 的描述部分是错误的。我会改变的。
【解决方案2】:

我认为问题出在这里:

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

【讨论】:

  • 发现 Tia。这段代码最初是为 SHA512 设置的,我转换为 SHA1 但错过了那行。当我将其更改为 SHA1 并将 resultsofHash 更改为 NSMutableString 时,代码就起作用了。谢谢你
【解决方案3】:

它崩溃了,因为 out 未保留。您应该添加保留:

resultOfHash = [[out description] retain];

或使用保留属性:

self.resultOfHash = [out description];

检查一下,它应该可以工作。

【讨论】:

  • 作者好像在用ARC。
  • 其实他没写过。
【解决方案4】:

您可能需要使用NSMutableString

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    • 2014-04-07
    • 2015-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    相关资源
    最近更新 更多