Iphone SecItemCopyMatching内存泄漏

Iphone SecItemCopyMatching内存泄漏,iphone,security,rsa,Iphone,Security,Rsa,我在下一个代码中有内存泄漏。这是RSA算法的一部分 - (SecKeyRef)getPublicKeyRef { OSStatus resultCode = noErr; SecKeyRef publicKeyReference = NULL; if(publicKey == NULL) { NSMutableDictionary * queryPublicKey = [[NSMutableDictionary alloc] init]; NSData *publicTag

我在下一个代码中有内存泄漏。这是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);
请告诉我如何解决这个问题。

您的方法有时会返回retain count+1的实例,而您很可能不会在代码的其余部分中释放它。如果调用SecItemCopyMatching,则返回retain count+1,但如果设置了publicKey,则函数返回的值retain count+-0不正确

您需要确保始终以相同的保留计数返回。在这种情况下,我会:

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

然后,方法的每个调用方都必须确保
CFRelease
值。。。但是这违反了get规则(它应该返回retain count+-0),因此可能最好重命名该方法。

但是SecItemCopyMatching呢,泄漏工具说这就是泄漏发生的地方。是的,因为您没有
CFRelease
ing在代码中使用
getPublicKeyRef
返回的值。仪器告诉你它是在哪里分配的。因此,您必须
cf在某处释放该值。但是如果已经设置了
publicKey
,它就会崩溃,这就是为什么您必须保留它,以便您的方法总是返回一个保留计数为+1的值。看,这是调用它的唯一位置,不是在那里发布的吗?状态=SecKeyEncrypt([self-getPublicKeyRef]、PADDING、plainBuffer、size、&cipherBuffer[0]、&cipherBufferSize);有同样的问题,奇怪的是文档没有特别提到返回的CFDictionaryRef的retain计数为+1。无论如何,在类似于您的代码中,如果返回状态为
noErr
且一切正常,我只需调用
[publicKeyReference autorelease]
。)谢谢你,亲爱的,你救了我一天。