SecItemCopyMatching内存泄漏

Ole*_*anu 6 security iphone rsa

我在下一个代码中有内存泄漏.我从这里获得灵感,这是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;
Run Code Online (Sandbox Code Playgroud)

}

泄漏仪器表示它正在泄漏:

resultCode = SecItemCopyMatching((CFDictionaryRef)queryPublicKey, (CFTypeRef *)&publicKeyReference);
Run Code Online (Sandbox Code Playgroud)

请告诉我怎么解决这个问题.

Dar*_*ust 6

您的方法有时会返回一个具有保留计数+1的实例,并且您很可能不会在其余代码中释放它.如果调用了SecItemCopyMatching,则返回retain count +1,但是如果设置了publicKey,那么你的函数返回一个值为retain count + -0,这是坏的.

您需要确保始终使用相同的保留计数返回.在这种情况下,我会这样做:

} else {
    publicKeyReference = publicKey;
    CFRetain(publicKeyReference);
}
Run Code Online (Sandbox Code Playgroud)

然后你的方法的每个调用者都必须确保CFRelease值...但是这违反了get规则(它应该返回保留计数+ -0),所以也许重新命名方法是个好主意.