Правильное использование FMDB / Memory - PullRequest
0 голосов
/ 02 февраля 2012

Мне не удалось найти решение моей проблемы в подобных вопросах. Я извлекаю целую кучу данных из базы данных sqlite с помощью оболочки fmdb. У меня есть метод в моем служебном классе fmdb, подобный этому:

  - (NSMutableArray *) getConnectionsForKey: (NSString *) key
 {

     NSString *query = [NSString stringWithFormat:@"select * from user" ];



     FMResultSet *results = [database executeQuery:query];

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

     while ([ results next ]) {

         NSString *fname = [ results stringForColumn:@"firstname" ];
         NSString *lname = [ results stringForColumn:@"lastname" ];


         NSMutableDictionary *aDictionary = [[ NSMutableDictionary alloc ]
                                               init
                                             ];

        [ aDictionary  
          setObject:fname 
          forKey:@"firstname" 
        ]; 

       [ aDictionary 
        setObject:lname 
        forKey:@"lastname" 
       ];



       [ retArray addObject:aDictionary ];

       [ aDictionary release ];


}

[ results close ];

return retArray;
}

Это хранит мою информацию в массиве словарей. В моем контроллере представления я вызываю свой метод следующим образом:

 -(void) setCurrentConnections: (NSString *) key {

   if ( currentConnections != nil ) {
         [ currentConnections removeAllObjects ];
   }

   LocalDatabase *db = [[ LocalDatabase alloc ] init ];

   [ db openDatabase ];

   currentConnections = [ db getConnectionsForKey:key ];

   [ db closeDatabase ];
  [ db release ];


}

Теперь каждый раз, когда я вызываю этот метод для обновления массива новыми контактами, у меня возникает постоянная утечка, которая продолжает накапливаться, как я наблюдаю с помощью инструмента выделения. Это происходит, даже когда я освобождаю currentConnections сразу после загрузки из базы данных и никогда больше не вызываю этот метод, поэтому я подозреваю, что это что-то с реализацией базы данных. Кто-нибудь еще занимался этой проблемой?

1 Ответ

1 голос
/ 02 февраля 2012

currentConnections просачивается в 'setCurrentConnections'.Вот как я мог бы это исправить (обратите внимание, что я также изменяю 'getConnectionsForKey', чтобы возвращать автоматически выпущенный объект).

 - (NSMutableArray *) getConnectionsForKey: (NSString *) key
 {

     NSString *query = [NSString stringWithFormat:@"select * from user" ];
     FMResultSet *results = [database executeQuery:query];

     NSMutableArray *retArray = [[ NSMutableArray alloc ] init ];
     while ([ results next ]) {

         NSString *fname = [ results stringForColumn:@"firstname" ];
         NSString *lname = [ results stringForColumn:@"lastname" ];
         NSMutableDictionary *aDictionary = [[ NSMutableDictionary alloc ] init];

        [ aDictionary  
          setObject:fname 
          forKey:@"firstname" 
        ]; 

       [ aDictionary 
        setObject:lname 
        forKey:@"lastname" 
       ];

       [ retArray addObject:aDictionary ];
       [ aDictionary release ];


       }

[ results close ];

return [retArray autorelease];
}


 -(void) setCurrentConnections: (NSString *) key {

   [ currentConnections removeAllObjects ];
   [ currentConnections release];

   LocalDatabase *db = [[ LocalDatabase alloc ] init ];

   [ db openDatabase ];

   currentConnections = [ db getConnectionsForKey:key ];
   [currentConnections retain];

   [ db closeDatabase ];
  [ db release ];

}

Возможно, вы можете пропустить вызов до removeAllObjects и просто вызвать release.Проблема в исходном коде состоит в том, что вы перезаписывали ссылку на существующее значение currentConnection, не выпуская его в первую очередь, что приводило к утечке.

...