Objective-C静态方法的结果保存到类实例变量,使用时给出“EXC_BAD_ACCESS”

时间:2011-01-12 04:42:03

标签: objective-c cocoa ios nsstring static-methods

我试图将md5字​​符串存储为类实例变量而不是实际密码。我有一个静态函数,它将返回一个md5字符串,我试图将其存储在实例变量而不是实际密码中。

我的类实例变量有以下setter:

-(void)setPassword:(NSString *)newpass{
 if(newpass != password){
  password = [utils md5HexDigest:newpass];
 }
}

这将传回正确的md5字符串并将其保存到我的init函数中的密码变量:[self setPassword:pword] ;.

如果我调用另一个实例方法并尝试访问self.password“我会得到”EXC_BAD_ACCESS“。

我知道内存已经被释放,但我无法确定它是否存在。

我尝试使用自动释放来分配init,但没有运气。

这是在init期间调用的md5HexDigest函数(在另一个stackoverflow问题中很容易找到):

+ (NSString*)md5HexDigest:(NSString*)input {
  const char* str = [input UTF8String];
  unsigned char result[CC_MD5_DIGEST_LENGTH];
  CC_MD5(str, strlen(str), result);

  NSMutableString *ret = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH*2];

  for(int i = 0; i<CC_MD5_DIGEST_LENGTH; i++)
    [ret appendFormat:@"%02x",result[i]];

  return ret;
}  

任何帮助/指针将不胜感激。我宁愿在内存中保存md5字符串,而不是每次需要使用密码时调用md5的实际密码。

提前致谢。

3 个答案:

答案 0 :(得分:3)

David和pwc都是正确的,但遗漏了一个重要的细节。

setPassword:应该copy入站参数。这将确保

  • retain正确,因为其他答案暗示,而且
  • set string不再可变。

即。类似的东西:

-(void)setPassword:(NSString *)newpass{
    [password release];
    password = [[utils md5HexDigest: newpass] copy];
}

答案 1 :(得分:2)

您的setter需要retain新值(从[utils md5HexDigest:newpass]返回的值)。 (并且不要忘记release旧值......)

此外,测试if(newpass != password)没有任何意义:newpass是实际密码,但password是md5摘要。

答案 2 :(得分:2)

md5HexDigest返回的NSString是自动释放的(因为NSMutableString stringWithCapacity返回一个自动释放的字符串)。您需要将其保留在setPassword中。否则,它将被自动释放池释放。