gpt4 book ai didi

iphone - SecItemCopyMatching 内存泄漏

转载 作者:行者123 更新时间:2023-12-03 18:44:44 28 4
gpt4 key购买 nike

我在下一个代码中出现内存泄漏。我的灵感来自here这是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的实例,并且您很可能不会在其余代码中释放它。如果调用 SecItemCopyMatching,您将返回保留计数 +1,但如果设置了 publicKey,则您的函数将返回保留计数 +-0 的值,这是不好的。

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

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

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

关于iphone - SecItemCopyMatching 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4722435/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com