iOS KeychainItemWrapper中的内存泄漏

时间:2011-12-29 07:38:37

标签: iphone ios memory-leaks keychain

我正在使用Apple的示例代码中的KeyChainItemWrapper来存储用户密码以进行身份​​验证,但是当我调用它来设置密码时:

   [keychain setObject:passwordField.text forKey:(id)kSecValueData];

它在我的衬衫上传递着内存泄漏。这个问题显然追溯到KeyChainItemWrapper.m中的第274行,这就是:

if (SecItemCopyMatching((CFDictionaryRef)genericPasswordQuery, (CFTypeRef *)&attributes) == noErr)
{

我将如何解决此问题,将来在使用Apple示例代码时应该更加小心?

注意:我可以发布更多代码,但我已经使用Instruments将问题缩小到这一行,并且任何开发人员都可以使用完整的示例代码。

3 个答案:

答案 0 :(得分:5)

查看KeyChainItemWrapper的代码,我同意这一行是内存泄漏。他们在[attributes release]结束时错过了writeToKeychain。请参阅此文件中对SecItemCopyMatching()的所有其他调用,以获取有关如何正确释放返回引用对象的示例。

我会使用本页底部的“这是好的,但是......”链接来记录错误。

答案 1 :(得分:3)

静态分析报告KeyChainItemWrapper.m的方法resetKeychainItem(第191行)中对象的潜在泄漏。令人惊讶的是,它没有报告上述区域中的潜在泄漏,尽管我确实按建议添加了对象的释放,以及正确性。

以下是报告泄漏的代码:

- (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];
}

此问题正在空字符串@&#34;&#34;上报告。我尝试了各种代码实现来尝试和#34;修复&#34;这个问题,但似乎没有任何工作。

这是假阳性吗?

更新:发布后我意识到我可以双击警告来追踪错误。

此警告归因于其上方用于分配字典的行:

if (!keychainItemData)
{
    self.keychainItemData = [[NSMutableDictionary alloc] init];
}

我将代码更改为以下内容:

if (!keychainItemData)
{
    self.keychainItemData = [[[NSMutableDictionary alloc] init] autorelease];
}

分析仪警告不再存在。

答案 2 :(得分:0)

我在- (void) resetKeychainItem找到了另一个漏洞。

应该是

self.pKeychainItemData = [[[NSMutableDictionary alloc] init] autorelease];