Iphone SecItemCopyMatching内存泄漏
我在下一个代码中有内存泄漏。这是RSA算法的一部分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
- (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]
。)谢谢你,亲爱的,你救了我一天。