iphone Memory Leak NSDictionary

时间:2011-06-08 21:45:54

标签: iphone objective-c memory-leaks

我对Objective-C中的内存管理不太熟悉,但我尽我所能。我的应用程序在几分钟后崩溃。在仪器的帮助下,我发现了许多泄漏。有时我只是忘了释放对象或者不把它放在Autorelease Pool中。但现在我真的不知道这个方法存在的问题。 仪器显示3行泄漏。

感谢您的帮助。

- (NSMutableArray *)rowsFromTablePages {

NSString *sql = [NSString stringWithFormat:@"SELECT paid, creationdate, lastuseddate, image, background, backgroundid FROM Pages WHERE nsid=%i ORDER BY paid", _nsid];

sqlite3_stmt *statement;
NSMutableArray *allPages = [[[NSMutableArray alloc] init] autorelease];

  if (sqlite3_prepare_v2(db, [sql UTF8String], -1, &statement, nil) == SQLITE_OK) {
      while (sqlite3_step(statement) == SQLITE_ROW) {
          int paid = (int)sqlite3_column_int(statement, 0);
          char *creationdate = (char *)sqlite3_column_text(statement, 1);
          char *lastuseddate = (char *)sqlite3_column_text(statement, 2);
          NSData *data = [NSData dataWithBytes:sqlite3_column_blob(statement, 3) length:sqlite3_column_bytes(statement, 3)]; // Leak
          NSData *databg = [NSData dataWithBytes:sqlite3_column_blob(statement, 4) length:sqlite3_column_bytes(statement, 4)]; // Leak
          int bgid = (int)sqlite3_column_int(statement, 5);

          NSDictionary *rowInArray = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:paid], @"PAID", [NSString stringWithUTF8String:creationdate], @"CREATIONDATE", [NSString stringWithUTF8String:lastuseddate], @"LASTUSEDDATE", [UIImage imageWithData:data], @"THUMBNAIL", [NSNumber numberWithInt:bgid], @"BGID", [UIImage imageWithData:databg], @"THUMBNAILBG", nil]; // Leak

          [allPages addObject:rowInArray];
      }
      sqlite3_finalize(statement);
  }
  return allPages;
}

在同一类中,仪器显示调用此方法的泄漏。

- (void)reloadDataFromSQL {
    _dataSource = [[NSMutableArray alloc] initWithArray:[self rowsFromTablePages]]; // Leak
    [self.tableView reloadData];
}

4 个答案:

答案 0 :(得分:1)

你在循环中运行了多少次?我怀疑是自动释放池可能过载并产生内存错误。尝试在while循环外声明变量并手动释放它们。让我知道它是如何工作的。

答案 1 :(得分:1)

尝试使用+dataWithBytesNoCopy:length:代替-dataWithBytes:length:。这将确保不复制字节,这应该可以阻止泄漏。

答案 2 :(得分:1)

在方法reloadDataFromSQL中,您将新内存分配给NSMutableArray的实例而不释放任何内容。

答案 3 :(得分:0)

尝试这个,如果它的工作.... 如果(_dataSource)

{

_dataSource = [self rowsFromTablePages];

}

否则 {

_dataSource = [[NSMutableArray alloc] initWithArray:[self rowsFromTablePages]]; //泄漏

}

[self.tableView reloadData];