[英]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.