Objective-C Результат статического метода, сохраненный в переменной экземпляра класса, давая «EXC_BAD_ACCESS» при использовании - PullRequest
5 голосов
/ 12 января 2011

Я пытаюсь сохранить строку md5 как переменную экземпляра класса вместо фактического пароля. У меня есть статическая функция, которая возвращает строку md5, которую я пытаюсь сохранить в переменной экземпляра вместо действительного пароля.

У меня есть следующий установщик для моей переменной экземпляра класса:

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

Это вернет правильную строку md5 и сохранит ее в переменной пароля в моей функции инициализации: [self setPassword: pword] ;.

Если я вызову другой метод экземпляра и попытаюсь получить доступ к self.password ", я получу" EXC_BAD_ACCESS ".

Я понимаю, что память освобождается, но я понятия не имею, чтобы убедиться, что она остается.

Я попытался выделить 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 ]

3 голосов
/ 12 января 2011

И Дэвид, и pwc верны, но упускают важную деталь.

setPassword: должен copy входящий параметр. Это гарантирует, что

  • это retain правильно, как и другие ответы, а также что
  • заданная строка больше не является изменяемой.

т.е. что-то вроде:

-(void)setPassword:(NSString *)newpass{
    [password release];
    password = [[utils md5HexDigest: newpass] copy];
}
2 голосов
/ 12 января 2011

NSString, возвращаемая md5HexDigest, автоматически освобождается (потому что NSMutableString stringWithCapacity возвращает автоматически выпущенную строку). Вам нужно сохранить его в setPassword. В противном случае он освобождается пулом автоматического выпуска.

2 голосов
/ 12 января 2011

Ваш установщик должен retain новое значение (возвращенное с [utils md5HexDigest:newpass]).(и не забудьте release старое значение тоже ...)

Кроме того, проверка if(newpass != password) не имеет никакого смысла: newpass - это действительный пароль, но password - этоДайджест MD5.

...