【问题标题】:Memory Leaks in UIPickerView using sqlite使用 sqlite 的 UIPickerView 中的内存泄漏
【发布时间】:2011-01-14 16:39:02
【问题描述】:

我将 self.notes 数组添加到 UIPickerView。这就是我设置数组的方式:

 NSMutableArray *notesArray = [[NSMutableArray alloc] init];
 [notesArray addObject:@"-"];
 [notesArray addObjectsFromArray:[dbManager getTableValues:@"Notes"]];
 self.notes = notesArray;
 [notesArray release];

UIPickerView 的信息是通过这种方法从数据库中获取的:

-(NSMutableArray *)getTableValues:(NSString *)table
{
  NSMutableArray *valuesArray = [[NSMutableArray alloc] init];
  if (sqlite3_open([self.databasePath UTF8String], &database) != SQLITE_OK)
  {
      sqlite3_close(database);
      NSAssert(0, @"Failed to open database");
  }
  else 
  {
   NSString *query = [[NSString alloc] initWithFormat:@"SELECT value FROM %@", table];
   sqlite3_stmt *statement;

   if (sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil) == SQLITE_OK)
   {
     while (sqlite3_step(statement) == SQLITE_ROW) {
     NSString *value =[NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 0)];
     [valuesArray addObject:value];
     [value release]; 
   }
   sqlite3_reset(statement);
  }
  [query release]; 
  sqlite3_finalize(statement);
  sqlite3_close(database);
 }
 return valuesArray;
}

但我不断在 Instruments 中发现这些行的内存泄漏:

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

[valuesArray addObject:value];

我在这里做错了什么?

感谢您的帮助!

【问题讨论】:

    标签: objective-c memory-leaks sqlite


    【解决方案1】:

    使用这一行代替NSMutableArray *valuesArray = [[NSMutableArray alloc] init];

    NSMutableArray *valuesArray = [NSMutableArray array];
    

    至于[valuesArray addObject:value]; 泄漏,将您的代码更改为:

    [valuesArray addObject:value];
    value = nil;
    

    【讨论】:

    • 值不应该在这里释放,因为它没有被分配。它正在泄漏,因为容器 valuesArray 正在泄漏。
    • 谢谢!我所有的泄漏都消失了
    【解决方案2】:

    您正在从已分配但未释放的 getTableValues 返回 valuesArray。您不能在方法中释放它,因为调用者仍然需要它。正确的方法是自动释放它。

    返回 [valuesArray 自动释放];

    而且你也不需要在将 value 字符串添加到 valuesArray 后释放它,因为它是使用方便的构造函数创建的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-11
      • 1970-01-01
      • 1970-01-01
      • 2019-11-14
      • 1970-01-01
      • 1970-01-01
      • 2010-12-01
      • 1970-01-01
      相关资源
      最近更新 更多