SecItemCopyMatching утечка памяти - PullRequest
6 голосов
/ 18 января 2011

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

- (SecKeyRef)getPublicKeyRef {
OSStatus resultCode = noErr;
SecKeyRef publicKeyReference = NULL;

if(publicKey == NULL) {
    NSMutableDictionary * queryPublicKey = [[NSMutableDictionary alloc] init];

    NSData *publicTag = [NSData dataWithBytes:publicKeyIdentifier

                                       length:strlen((const char *)publicKeyIdentifier)]; 

    // Set the public key query dictionary.
    [queryPublicKey setObject:(id)kSecClassKey forKey:(id)kSecClass];
    [queryPublicKey setObject:publicTag forKey:(id)kSecAttrApplicationTag];

    [queryPublicKey setObject:(id)kSecAttrKeyTypeRSA forKey:(id)kSecAttrKeyType];

    [queryPublicKey setObject:[NSNumber numberWithBool:YES] forKey:(id)kSecReturnRef];

    // Get the key.     
    resultCode = SecItemCopyMatching((CFDictionaryRef)queryPublicKey, (CFTypeRef *)&publicKeyReference);
   // NSLog(@"getPublicKey: result code: %d", resultCode);

    if(resultCode != noErr)
    {
        publicKeyReference = NULL;
    }

    // [publicTag release];
    [queryPublicKey release];
} else {
    publicKeyReference = publicKey;
}

return publicKeyReference;

}

Инструмент «Утечка» говорит, что в этой строке течет:

resultCode = SecItemCopyMatching((CFDictionaryRef)queryPublicKey, (CFTypeRef *)&publicKeyReference);

Скажите, пожалуйста, как я мог решить эту проблему.

1 Ответ

6 голосов
/ 18 января 2011

Ваш метод иногда , возвращающий экземпляр с сохранением количества +1, и вы, скорее всего, не выпускаете его в оставшейся части кода. Вы возвращаете с сохранением счетчика +1, если вызывается SecItemCopyMatching, но если установлен publicKey, то ваша функция возвращает значение с сохранением счетчика + -0, что плохо.

Вы должны убедиться, что вы всегда возвращаетесь с одним и тем же счетом удержания. В этом случае я бы сделал:

} else {
    publicKeyReference = publicKey;
    CFRetain(publicKeyReference);
}

Тогда каждый вызывающий ваш метод должен удостовериться, что CFRelease значение ... но это нарушит правило get (оно должно вернуть retain count + -0), так что, возможно, это будет будет хорошей идеей переименовать метод.

...