iphone内存泄漏

iphone内存泄漏,iphone,objective-c,memory-leaks,Iphone,Objective C,Memory Leaks,我不太熟悉Objective-C中的内存管理,但我尽了最大努力。我的应用程序在几分钟后崩溃。在仪器的帮助下,我发现了许多漏洞。有时我只是忘记释放对象,或者没有将其放入自动释放池。但是现在我真的不知道这个方法的问题在哪里。 仪表显示3条管线存在泄漏 谢谢你的帮助 - (NSMutableArray *)rowsFromTablePages { NSString *sql = [NSString stringWithFormat:@"SELECT paid, creationdate, lastu

我不太熟悉Objective-C中的内存管理,但我尽了最大努力。我的应用程序在几分钟后崩溃。在仪器的帮助下,我发现了许多漏洞。有时我只是忘记释放对象,或者没有将其放入自动释放池。但是现在我真的不知道这个方法的问题在哪里。 仪表显示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];
}

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

尝试使用
+datawithbytesnopy:length:
而不是
-dataWithBytes:length:
。这将确保不会复制字节,这将阻止泄漏。

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

如果可行,请尝试此方法。

。。。。 如果(_数据源)

{

_数据源=[self rowsFromTablePages]

}

否则 {

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

}


[self.tableView重载数据]

@HMMurdoc它标记了哪行?我在三行的末尾写“//漏”lines@HMMurdoc如果省略
NSDictionary*rowInArray=…
[allPages addObject:rowInArray]行泄漏是否仍然存在?我不能忽略它们,因为TabeView在没有阵列的情况下无法加载。我无法模拟它。另一个主意?!如果我错了,请纠正我,但我认为仪器指向泄漏对象的分配,而不是对象的实际泄漏。由于您是通过
allPages
间接返回这些对象,所以不能在其他任何地方泄漏?循环运行了3次,因为我的数据库中有3行。我将尝试在外部声明变量。在+dataWithBytesNoCopy中,我不能使用sqlite3\u column\u blob(语句,3)。有什么想法吗?dataWithBytes需要一个“const void*”而dataWithBytesNoCopy需要一个“void*”。我不明白这将如何阻止泄漏,因为NSData的字节复制通常不会造成泄漏。由于SQLite3应该自动从
SQLite3\u column\u blob()
读取内存,因此我认为这将导致双重空闲。我错过了什么吗?哦,那很痛苦。。。我添加了“[\u数据源发布];”在第一行“-(void)reloadDataFromSQL{…}”。漏洞消失了。谢谢大家!