EXC_BAD_ACCESS при использовании строки, объявленной в заголовочном файле - PullRequest
0 голосов
/ 06 января 2012

Я объявил строку в заголовочном файле примерно так:

@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 = [вне описания];

с

NSString *local = [out description];
return local;

и преобразование работает нормально, и когда я отлаживаю построчно, отладчик переходит к закрывающей скобке моего метода, а затем выдает ошибку EXC_BAD_ACCESS.

Я пытался запустить NSZombie, но ничего не нашел.

Любая помощь в попытках разобраться в этом будет принята с благодарностью.

Ответы [ 4 ]

1 голос
/ 06 января 2012

Посмотрите на ответ на этот вопрос .Попробуйте преобразовать в NSString, используя

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

Я не тестировал этот код с этой кодировкой, но он похож на то, что я уже использую

Обновление -

Я исправил ошибку в коде выше.Я как-то оставил метод подписи в отвлеченной копии и вставке.

0 голосов
/ 06 января 2012

Я думаю, что проблема здесь:

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 вместо.

0 голосов
/ 06 января 2012

Вам, вероятно, нужно использовать NSMutableString.

0 голосов
/ 06 января 2012

Это сбой, потому что out не сохраняется. Вы должны добавить сохранить:

resultOfHash = [[out description] retain];

или использовать оставшееся свойство:

self.resultOfHash = [out description];

Проверьте это, это должно работать.

...