Утечка памяти iPhone из-за stringWithUTF8String - PullRequest
2 голосов
/ 06 сентября 2010

У меня есть следующий код, который показывает утечку памяти для избранного объекта рядом с оператором с stringWithUTF8String.

Я объявил избранное в свойстве

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

Пожалуйста, дайте мне знать, как решитьэта проблема утечки памяти Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 06 сентября 2010

Используйте этот безопасный метод:

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

Как правило, в вашей любимой функции dealloc вы должны удалить все объекты и очистить все необходимое перед вызовом функции super dealloc.

Используя этот способ, вам не нужно беспокоиться о том, является ли избранное ноль или нет, так как target-c позволяет вызывать методы для объектов nil

Привет

Меир Ассаяг

1 голос
/ 06 сентября 2010

Не уверен насчет утечки stringWithUTF8String, но это проблема:

favorites = nil;
[favorites removeAllObjects];

Вы пропускаете то, что было в favorites, а затем говорите объекту nil удалить все объектыноль, по определению его нет.Затем вы попытаетесь добавить к нему объекты;это тоже не сработает.

0 голосов
/ 06 сентября 2010

Я не вижу утечки в вашей строке с UTF8String, этот код работает хорошо.Тем не менее, посмотрите на весь метод, я обнаружил, что что-то может создать проблемы с памятью, такие как утечка или сбой.Если вы уже объявили свойство для избранного, то вам следует использовать self.favorites здесь

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

становится:

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

Это поможет вам во многих вещах в управлении памятью, напримерв другом условии вы устанавливаете переменную равной nil, но не освобождаете ее, а в первом условии вы освобождаете объект nil?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...