我使用苹果示例代码中的KeyChainItemWrapper来存储用于身份验证的用户密码,但是当我调用它来设置密码时:
[keychain setObject:passwordField.text forKey:(id)kSecValueData];我的衬衫上到处都是内存。这个问题显然可以追溯到KeyChainItemWrapper.m中的第274行,即:
if (SecItemCopyMatching((CFDictionaryRef)genericPasswordQuery, (CFTypeRef *)&attributes) == noErr)
{我该如何解决这个问题,将来在使用Apple示例代码时,我应该更加小心吗?
注意:我可以发布更多的代码,但我已经使用Instruments将问题缩小到这一行,并且所有开发人员都可以很容易地获得完整的示例代码。
发布于 2011-12-29 15:57:45
看一下KeyChainItemWrapper的代码,我同意这一行是内存泄漏。他们错过了writeToKeychain末尾的[attributes release]。有关如何正确释放通过引用返回的对象的示例,请参阅此文件中对SecItemCopyMatching()的所有其他调用。
我会用“这很好,但是...”链接以注明错误。
发布于 2014-04-29 00:53:44
静态分析正在报告KeyChainItemWrapper.m的方法resetKeychainItem的第191行中的on对象的潜在泄漏。令人惊讶的是,它没有报告上面提到的区域中的潜在泄漏,尽管为了正确起见,我确实添加了对象的释放。
以下是报告泄漏的代码:
- (void)resetKeychainItem
{
...
// Default attributes for keychain item.
[keychainItemData setObject:@"" forKey:(id)kSecAttrAccount]; // <-- Potential leak of an object
[keychainItemData setObject:@"" forKey:(id)kSecAttrLabel];
[keychainItemData setObject:@"" forKey:(id)kSecAttrDescription];
// Default data for keychain item.
[keychainItemData setObject:@"" forKey:(id)kSecValueData];
}此问题在空字符串@"“上报告。我尝试了各种代码实现,试图“修复”这个问题,但似乎都不起作用。
这是假阳性吗?
更新:在发布后,我意识到我可以双击警告来跟踪错误。
此警告应归因于其上方用于分配字典的行:
if (!keychainItemData)
{
self.keychainItemData = [[NSMutableDictionary alloc] init];
}我将代码更改为以下代码:
if (!keychainItemData)
{
self.keychainItemData = [[[NSMutableDictionary alloc] init] autorelease];
}分析器警告不再存在。
发布于 2012-12-24 11:26:13
我在- (void) resetKeychainItem中发现了另一个漏洞。
它应该是
self.pKeychainItemData = [[[NSMutableDictionary alloc] init] autorelease];。
https://stackoverflow.com/questions/8665165
复制相似问题