【问题标题】:Correct Usage FMDB / Memory正确使用 FMDB / 内存
【发布时间】:2012-02-24 13:39:29
【问题描述】:

我无法在类似问题中找到解决问题的方法。我正在使用 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 并且不再调用此方法时也会发生这种情况,因此我怀疑它与数据库实现有关。有其他人处理过这个问题吗?

【问题讨论】:

    标签: objective-c ios sqlite memory fmdb


    【解决方案1】:

    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 的引用,因此导致了泄漏。

    【讨论】:

      猜你喜欢
      • 2011-10-18
      • 2011-09-28
      • 1970-01-01
      • 2014-04-27
      • 2013-05-03
      • 1970-01-01
      • 2012-05-10
      • 1970-01-01
      • 2015-05-13
      相关资源
      最近更新 更多