6 Stimmen

SecItemCopyMatching Speicherleck

Ich habe ein Speicherleck im folgenden Code. Ich inspiriert von aquí und dies ist ein Teil des RSA-Algorithmus.

- (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;

}

Das Leck-Instrument zeigt an, dass es in dieser Leitung undicht ist:

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

Bitte sagen Sie mir, wie ich das Problem lösen kann.

6voto

DarkDust Punkte 87647

Ihre Methode ist manchmal eine Instanz mit retain count +1 zurückgeben und Sie werden sie höchstwahrscheinlich im Rest Ihres Codes nicht freigeben. Sie kehren mit Retain Count +1 zurück, wenn SecItemCopyMatching aufgerufen wird, aber wenn publicKey gesetzt ist, gibt Ihre Funktion einen Wert mit Retain Count +-0 zurück, was schlecht ist.

Sie müssen darauf achten, dass Sie immer mit der gleichen Anzahl von Wiederholungen zurückkehren. In diesem Fall würde ich das tun:

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

Dann muss jeder Aufrufer Ihrer Methode dafür sorgen, dass CFRelease den Wert... aber das würde gegen die erhalten. Regel (sie sollte retain count +-0 zurückgeben), also wäre es vielleicht eine gute Idee, die Methode umzubenennen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X