Pérdida de memory en iOS KeychainItemWrapper

Estoy usando el KeyChainItemWrapper del código de ejemplo de Apple para almacenar la contraseña del usuario para la authentication, pero cuando lo llamo para configurar la contraseña:

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

Gotea gotas de memory por toda mi camisa. El problema aparentemente se remonta a la línea 274 en KeyChainItemWrapper.m, que es este:

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

¿Cómo solucionaría esto, y debería tener más cuidado al trabajar con el código de muestra de Apple en el futuro?

Nota: podría publicar más código, pero he networkingucido el problema a esta línea usando Instruments y el código de ejemplo completo está disponible para cualquier desarrollador.

Mirando el código para KeyChainItemWrapper , estaría de acuerdo que esta línea es una pérdida de memory. Se perdieron el [attributes release] al final de writeToKeychain . Vea todas las otras llamadas a SecItemCopyMatching() en este file para ver ejemplos de cómo lanzan correctamente el object devuelto por reference.

Utilizaría el enlace "Es bueno, pero …" al pie de esta página para anotar el error.

El análisis estático informa una posible fuga de un object en el método resetKeychainItem, línea 191, de KeyChainItemWrapper.m. Sorprendentemente, no informa sobre una posible fuga en el área abordada anteriormente, aunque sí agregué la liberación del object como se sugirió, y por lo que respecta a la corrección.

Aquí está el código con la fuga que se informa:

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

Este problema se informa en la cadena vacía @ "". Probé varias implementaciones de código para tratar de "solucionar" este problema, pero parece que nada funciona.

¿Es esto un falso positivo?

Actualización: Justo después de publicar, me di count de que puedo hacer doble clic en la advertencia para rastrear el error.

Esta advertencia se atribuye a la línea que se encuentra arriba para asignar el dictionary:

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

Cambié el código a lo siguiente:

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

La advertencia del analizador ya no está presente.

Encontré otra fuga en - (void) resetKeychainItem .

Debería ser

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