簡體   English   中英

正確使用FMDB /內存

[英]Correct Usage FMDB / Memory

我無法在類似問題中找到解決問題的方法。 我正在使用fmdb包裝器從sqlite數據庫中提取一大堆數據。 我的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,再也不再調用此方法時,這種情況才會發生,因此我懷疑這與數據庫實現有關。 還有其他人處理過這個問題嗎?

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的調用,而只是釋放。 原始代碼中的問題是您正在覆蓋對現有currentConnection的引用,而沒有先釋放它,因此導致泄漏。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM