2012-09-05 5 views
0

Voici la fuite: enter image description herecode d'accès Trousseau fuite

Et voici mon code:

+(NSString *)getSecureValueForKey:(NSString *)key { 

    // Retrieve a value from the keychain 
    NSDictionary *result; 
    NSArray *keys = [[[NSArray alloc] initWithObjects: (NSString *) kSecClass, kSecAttrAccount, kSecReturnAttributes, nil] autorelease]; 
    NSArray *objects = [[[NSArray alloc] initWithObjects: (NSString *) kSecClassGenericPassword, key, kCFBooleanTrue, nil] autorelease]; 
    NSDictionary *query = [[NSDictionary alloc] initWithObjects: objects forKeys: keys]; 

    // Check if the value was found 
    OSStatus status = SecItemCopyMatching((CFDictionaryRef) query, (CFTypeRef *) &result); 
    [query release]; 
    if (status != noErr) { 
     // Value not found 
     return nil; 
    } else { 
     // Value was found so return it 
     NSString *value = (NSString *) [result objectForKey: (NSString *) kSecAttrGeneric]; 
     return value; 
     [result release]; 
    } 
} 

+(BOOL)storeSecureValue:(NSString *)value forKey:(NSString *)key { 
    // Get the existing value for the key 
    NSString *existingValue = [self getSecureValueForKey:key]; 

    // Check if a value already exists for this key 
    OSStatus status; 
    if (existingValue) { 
     // Value already exists, so update it 
     NSArray *keys = [[[NSArray alloc] initWithObjects: (NSString *) kSecClass, kSecAttrAccount, nil] autorelease]; 
     NSArray *objects = [[[NSArray alloc] initWithObjects: (NSString *) kSecClassGenericPassword, key, nil] autorelease]; 
     NSDictionary *query = [[[NSDictionary alloc] initWithObjects: objects forKeys: keys] autorelease]; 
     status = SecItemUpdate((CFDictionaryRef) query, (CFDictionaryRef) [NSDictionary dictionaryWithObject:value forKey: (NSString *) kSecAttrGeneric]); 
    } else { 
     // Value does not exist, so add it 
     NSArray *keys = [[[NSArray alloc] initWithObjects: (NSString *) kSecClass, kSecAttrAccount, kSecAttrGeneric, nil] autorelease]; 
     NSArray *objects = [[[NSArray alloc] initWithObjects: (NSString *) kSecClassGenericPassword, key, value, nil] autorelease]; 
     NSDictionary *query = [[[NSDictionary alloc] initWithObjects: objects forKeys: keys] autorelease]; 
     status = SecItemAdd((CFDictionaryRef) query, NULL); 
    } 

    // Check if the value was stored 
    if (status != noErr) { 
     // Value was not stored 
     return false; 
    } else { 
     // Value was stored 
     return true; 
    } 
} 

Pouvez-vous me aider à résoudre ce problème? La fuite est chaque fois que j'accède ou stocke des données dans le trousseau. Je n'ai pas programmé sans ARC pour beaucoup de temps, et je ne peux pas suivre cette fuite!

Merci!

+0

Est-ce que '[release release];' avant la valeur de retour; ' – Adam

Répondre

0

de presse keys et objects après avoir créé query, relâchez resultavant retour value, libérer réellement de nouveaux objets créés au cours de votre magasin méthode de la valeur sûre. À ce stade, vous pouvez apprendre comment fonctionne réellement la gestion de la mémoire, ou simplement allumer ARC et lui laisser le plus de choses possible.

+0

' keys' et 'objects' sont auto-libérés. Je préférerais les relâcher manuellement, mais tout de même, ils ne fuient pas. – Adam

Questions connexes