簡體   English   中英

iOS KeychainItemWrapper中的內存泄漏

[英]Memory Leak in iOS KeychainItemWrapper

我正在使用Apple的示例代碼中的KeyChainItemWrapper來存儲用戶密碼以進行身份​​驗證,但是當我調用它來設置密碼時:

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

它在我的襯衫上傳遞着內存泄漏。 問題顯然是追溯到KeyChainItemWrapper.m中的第274行,這是:

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

我該如何解決這個問題,將來在使用Apple示例代碼時應該更加小心?

注意:我可以發布更多代碼,但我已經使用Instruments將問題縮小到這一行,並且任何開發人員都可以使用完整的示例代碼。

查看KeyChainItemWrapper的代碼,我同意這行是內存泄漏。 他們在writeToKeychain結束時錯過了[attributes release] 查看此文件中對SecItemCopyMatching()所有其他調用,以SecItemCopyMatching()有關它們如何正確釋放返回引用對象的示例。

我會使用本頁底部的“這是好的,但是......”鏈接來記錄錯誤。

靜態分析報告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];
}

分析儀警告不再存在。

我發現另一個漏洞- (void) resetKeychainItem

它應該是

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM