2010-09-06 6 views
2

J'ai le code suivant qui montre la fuite de mémoire pour l'objet favori près de l'instruction avec stringWithUTF8String.fuite de mémoire de l'iPhone en raison de stringWithUTF8String

j'ai déclaré favoris dans la propriété

-(NSMutableArray *) readFavoritesFromDatabase 
{ 
// Check if database is present 
[self setDatabaseNameAndPath]; 
[self checkAndCreateDatabase]; 

// Setup the database object 
sqlite3 *database; 

//Initialize favorites array 
if (favorites == nil) 
{ 
    [favorites release]; 
    favorites = [[NSMutableArray alloc] init]; 
} 
else 
{ 
    favorites = nil; 
    [favorites removeAllObjects]; 
} 


// Open the database from the users file system 
if(sqlite3_open([self.dataBasePath UTF8String], &database) == SQLITE_OK) 
{ 
    // Setup the SQL Statement and compile it for faster access 
    const char *sqlStatement = "select * from Favorites"; 
    sqlite3_stmt *compiledStatement; 

    if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) 
    { 

    // Loop through the results and add them to the favorites array 
    while(sqlite3_step(compiledStatement) == SQLITE_ROW) 
    { 
    // Create Favorite object and add it to the Favorite array 
    Favorite *favorite = [[[Favorite alloc] init] autorelease]; 

    favorite.cameraID = [NSString stringWithUTF8String:(const char*)sqlite3_column_text(compiledStatement, 0)]; 
    favorite.cameraName = [NSString stringWithUTF8String:(const char*)sqlite3_column_text(compiledStatement, 1)]; 
    favorite.cameraLink = [NSString stringWithUTF8String:(const char*)sqlite3_column_text(compiledStatement, 2)]; 

    [self.favorites addObject:favorite]; 
    //[favorite.cameraID release]; 
// [favorite.cameraName release]; 
// [favorite.cameraLink release]; 
    } 

    // If favorite cameras exists in database, then sort the Favorites array 
    if([self.favorites count]>0) 
    { 

    NSSortDescriptor *favoritesNameSorter = [[NSSortDescriptor alloc] initWithKey:@"cameraName" ascending:YES]; 
    [self.favorites sortUsingDescriptors:[NSArray arrayWithObject:favoritesNameSorter]]; 
    [favoritesNameSorter release]; 
    } 
    } 

    // Release the compiled statement from memory 
    sqlite3_finalize(compiledStatement); 
} 

// Close the database 
if(database !=nil) 
{ 
    sqlite3_close(database); 
    return self.favorites; 
} 
else 
{ 
    return nil; 
} 
} 

S'il vous plaît laissez-moi savoir comment résoudre ce problème de fuite de mémoire Merci d'avance.

+0

S'il vous plaît voir ma réponse à ce lien [entrer description du lien ici] [1] [1]: http://stackoverflow.com/questions/6185533/memory-leak-in-nsstring-stringwithutf8string/9955130 # 9955130 J'espère que cela va vous aider –

Répondre

-1

Je ne vois aucune fuite dans votre stringWithUTF8String, ce code fonctionne bien. Cependant, regardez toute la méthode, j'ai trouvé quelque chose peut créer des problèmes de mémoire comme des fuites ou des accidents. Si vous avez déjà déclarée une propriété pour les favoris, vous devez utiliser self.favorites ici

//Initialize favorites array 
if (favorites == nil) 
{ 
    [favorites release]; 
    favorites = [[NSMutableArray alloc] init]; 
} 
else 
{ 
    favorites = nil; 
    [favorites removeAllObjects]; 
} 

devient:

//Initialize favorites array 
if (self.favorites == nil) 
{ 
    self.favorites = [[NSMutableArray alloc] init]; 
} 
else 
{ 
    self.favorites = nil; 
} 

Il vous aidera beaucoup de choses dans les directions de mémoire, comme dans votre état autre, vous mettre la variable à zéro mais ne pas la libérer, et dans la première condition, vous libérez un objet nul?

+0

Je pense que ma première réponse n'était pas assez claire et pas vraiment répondre directement à la question. Espérons que la version éditée clarifier et aider quelque chose à l'auteur de la question – vodkhang

+1

Si la propriété 'favorites' est définie comme' (retain) ', vous ne devez PAS l'utiliser. –

+0

+1 pour ne pas l'utiliser s'il est retenu. – jer

1

Utilisez cette méthode sûre:

Favorite *tempFavorite = [[Favorite alloc] init]; 
self.favorite = tempFavorite; 
[tempFavorite release]; 

Normaly, dans votre fonction préférée dealloc, vous devez supprimer tous les objets et nettoyer ce nécessaire avant d'appeler la fonction super dealloc.

En utilisant cette façon, vous n'avez pas besoin de vous soucier si favori est nul ou non, puisque c-objectif permet aux méthodes d'appel des objets nil

Cordialement

Meir Assayag

+0

favori ici est une variable locale. Donc, je ne vois pas de raison de le faire. S'il vous plaît élaborer. – user382535

1

ne suis pas sûr la fuite stringWithUTF8String, mais cela est un problème:

favorites = nil; 
[favorites removeAllObjects]; 

Vous fuyez ce qui était dans favorites puis dire un nil objet pour supprimer tous les objets - c'est nul, par définition, il n'en a aucun. Ensuite, plus tard, vous essayez d'ajouter des objets; ça ne marchera pas non plus.

+0

J'avais précédemment gardé seulement [favorites removeAllObjects] seulement mais cela n'a pas non plus enlevé les fuites de mémoire.Ce code fonctionne bien – user382535

+0

Qu'arrive-t-il à l'ancien contenu de 'favorites' après lui avoir assigné' nil'? –