2012-02-01 10 views
0

私は同様の質問で私の問題の解決策を見つけることができませんでした。私は、fmdbラッパーを使用して、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

currentConnectionsが 'setCurrentConnections'に漏れています。ここで私はそれを修正する方法です(私はまた、autoreleasedオブジェクトを返すために '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 ]; 

} 

おそらく​​への呼び出しをスキップし、リリースを呼び出すことができます。元のコードの問題は、既存のcurrentConnectionへの参照を最初に解放せずに上書きしてリークを引き起こすことです。

関連する問題