Утечка памяти в iOS KeychainItemWrapper - PullRequest
5 голосов
/ 29 декабря 2011

Я использую KeyChainItemWrapper из примера кода Apple для хранения пароля пользователя для аутентификации, но когда я вызываю его, чтобы установить пароль:

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

Это приводит к утечке памяти по всей моей рубашке.По-видимому, проблема восходит к строке 274 в KeyChainItemWrapper.m, которая выглядит следующим образом:

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

Как бы это исправить, и я должен быть более осторожным при работе с образцом кода Apple в будущем?

Примечание: я мог бы опубликовать больше кода, но я сузил проблему до этой строки, используя инструменты, и полный пример кода легко доступен любому разработчику.

Ответы [ 3 ]

5 голосов
/ 29 декабря 2011

Глядя на код для KeyChainItemWrapper , я бы согласился, что эта строка является утечкой памяти. Они пропустили [attributes release] в конце writeToKeychain. Посмотрите все другие вызовы SecItemCopyMatching() в этом файле для примеров того, как они правильно освобождают объект, возвращенный по ссылке.

Я бы использовал ссылку "Это хорошо, но ..." внизу этой страницы, чтобы заметить ошибку.

3 голосов
/ 28 апреля 2014

Статический анализ сообщает о потенциальной утечке объекта в методе resetKeychainItem, строка 191, KeyChainItemWrapper.m.Удивительно, но он не сообщает о потенциальной утечке в области, указанной выше, хотя я добавил освобождение объекта в соответствии с предложением и для корректности.

Вот код с сообщаемой утечкой:

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

Предупреждение анализатора больше не отображается.

0 голосов
/ 24 декабря 2012

Я обнаружил еще одну утечку в - (void) resetKeychainItem.

должно быть

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

...