【问题标题】:Memory Leak in iOS KeychainItemWrapperiOS KeychainItemWrapper 中的内存泄漏
【发布时间】:2011-12-29 07:38:37
【问题描述】:

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

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

我的衬衫上到处都是内存泄漏。问题显然可以追溯到 KeyChainItemWrapper.m 中的第 274 行,即:

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

我将如何解决这个问题,我以后在使用 Apple 示例代码时应该更加小心吗?

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

【问题讨论】:

    标签: iphone ios memory-leaks keychain


    【解决方案1】:

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

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

    【讨论】:

    • 这正是问题所在。只需添加[属性发布];到该链接的功能插件的末尾。已按照您的建议将此错误报告给 Apple。
    • 哇——就示例代码而言,我认为 KeychainItemWrapper 是最糟糕的!到处自动释放,至少有 2 个已知的内存泄漏,包括上面的,还有一个正在初始化 keychainItemData ...
    • npellow,自动发布有什么问题?他们只是在某个时候释放。苹果经常使用它们。事实上,这是他们希望我们如何编程
    【解决方案2】:

    静态分析报告 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];
    }
    

    在空字符串@"" 上报告了此问题。我尝试了各种代码实现来尝试“修复”这个问题,但似乎没有任何效果。

    这是误报吗?

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

    此警告归因于它上面用于分配字典的行:

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

    我把代码改成如下:

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

    分析器警告不再存在。

    【讨论】:

      【解决方案3】:

      我在- (void) resetKeychainItem 中发现了另一个漏洞。

      应该是

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

      【讨论】:

      • 为什么不self.pKeychainItemData = [NSMutableDictionary dictionary];?干净多了……
      猜你喜欢
      • 1970-01-01
      • 2012-02-18
      • 1970-01-01
      • 1970-01-01
      • 2011-08-31
      • 2013-04-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多