我正在使用Apple的示例代码中的KeyChainItemWrapper来存储用户密码以进行身份验证,但是当我调用它来设置密码时:
[keychain setObject:passwordField.text forKey:(id)kSecValueData];
它在我的衬衫上传递着内存泄漏。这个问题显然追溯到KeyChainItemWrapper.m中的第274行,这就是:
if (SecItemCopyMatching((CFDictionaryRef)genericPasswordQuery, (CFTypeRef *)&attributes) == noErr)
{
我将如何解决此问题,将来在使用Apple示例代码时应该更加小心?
注意:我可以发布更多代码,但我已经使用Instruments将问题缩小到这一行,并且任何开发人员都可以使用完整的示例代码。
答案 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];
。