2011-01-14 13 views
2

Ich bin Hinzufügen von selbst. Notes Array zu einem UIPickerView. Dies ist, wie ich das Array habe die Einrichtung:Speicherlecks in UIPickerView mit sqlite

NSMutableArray *notesArray = [[NSMutableArray alloc] init]; 
[notesArray addObject:@"-"]; 
[notesArray addObjectsFromArray:[dbManager getTableValues:@"Notes"]]; 
self.notes = notesArray; 
[notesArray release]; 

Die Informationen für die UIPickerView aus der Datenbank in diesem Verfahren genommen wird:

-(NSMutableArray *)getTableValues:(NSString *)table 
{ 
    NSMutableArray *valuesArray = [[NSMutableArray alloc] init]; 
    if (sqlite3_open([self.databasePath UTF8String], &database) != SQLITE_OK) 
    { 
     sqlite3_close(database); 
     NSAssert(0, @"Failed to open database"); 
    } 
    else 
    { 
    NSString *query = [[NSString alloc] initWithFormat:@"SELECT value FROM %@", table]; 
    sqlite3_stmt *statement; 

    if (sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil) == SQLITE_OK) 
    { 
    while (sqlite3_step(statement) == SQLITE_ROW) { 
    NSString *value =[NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 0)]; 
    [valuesArray addObject:value]; 
    [value release]; 
    } 
    sqlite3_reset(statement); 
    } 
    [query release]; 
    sqlite3_finalize(statement); 
    sqlite3_close(database); 
} 
return valuesArray; 
} 

Aber ich erhalte Speicherlecks in Instrumenten für diese Linien:

NSMutableArray * WerteArray = [[NSMutableArray alloc] init];

und

[Arraywerte addObject: value];

Was mache ich hier falsch?

Danke für Ihre Hilfe!

Antwort

0

Statt NSMutableArray *valuesArray = [[NSMutableArray alloc] init]; Verwendung dieser Linie:

NSMutableArray *valuesArray = [NSMutableArray array]; 

Was das [valuesArray addObject:value]; Leck, um Ihren Code dies ändern:

[valuesArray addObject:value]; 
value = nil; 
+0

Wert sollte hier nicht freigegeben werden, da es nicht alloced ist. Es ist undicht, da der Container WerteArray undicht ist. – taskinoor

+0

Danke! Alle meine Lecks sind weg – Danamo

0

Sie geben valuesArray von den getTableValues ​​zurück, die zugewiesen, aber nicht freigegeben sind. Sie können es nicht in der Methode freigeben, da der Aufrufer es immer noch benötigt. Der richtige Weg ist die automatische Freigabe.

 
return [valuesArray autorelease]; 

Und auch Sie müssen nicht Wert Zeichenfolge freizugeben, nachdem es zu Arraywert Zugabe, wie es mit einem bequemen Konstruktor erstellt wird.