【发布时间】:2011-06-23 18:46:31
【问题描述】:
根据仪器,这些行存在内存泄漏
cat.catName = (catName)?[NSString stringWithUTF8String:catName]:@"";
NSData *dataForCachedImage = [[NSData alloc] initWithBytes:sqlite3_column_blob(statement, 2) length: sqlite3_column_bytes(statement, 2)];
cat.catThumb = [UIImage imageWithData:dataForCachedImage];
[dataForCachedImage release];
在下面的代码中。
我还静态分析了代码.. 显示此文件中没有问题。
-(NSMutableArray *)getAllItems{
NSMutableArray *items = [[[NSMutableArray alloc] init] autorelease];
const char *sql = "SELECT * FROM category ORDER by sort";
sqlite3_stmt *statement;
int sqlresult = sqlite3_prepare(database, sql, -1, &statement, nil);
if (sqlresult == SQLITE_OK) {
while (sqlite3_step(statement) == SQLITE_ROW) {
Category *cat = [[Category alloc] init];
char *catName = (char *)sqlite3_column_text(statement, 1);
cat.catID = sqlite3_column_int(statement, 0);
cat.catName = (catName)?[NSString stringWithUTF8String:catName]:@"";
NSData *dataForCachedImage = [[NSData alloc] initWithBytes:sqlite3_column_blob(statement, 2) length: sqlite3_column_bytes(statement, 2)];
cat.catThumb = [UIImage imageWithData:dataForCachedImage];
[dataForCachedImage release];
cat.catLock = sqlite3_column_int(statement, 3);
cat.sort = sqlite3_column_int(statement, 4);
cat.total = [self totalSMS:cat.catID];
[items addObject:cat];
[cat release];
}
sqlite3_finalize(statement);
}
else
{
NSLog(@"problem with the database");
NSLog(@"%d",sqlresult);
}
return items;}
有人可以指出吗? 谢谢
【问题讨论】:
-
如果你打破标准的 C sqlite3 调用并分析,我想你会很清楚地看到发生了什么。喜欢:
const void * blob = sqlite3_column_blob(statement, 2); -
但这并不意味着您应该将它们发送到 sqlite3_free() sqlite 3 在后台处理。
-
@Grady:我仍然很困惑...我尝试使用您建议的代码,但我仍然得到相同的旧 380 次泄漏!...请您详细说明...新手在这里!
-
我认为这是一个泄漏,因为您不再有指向内存的有效指针,但它并不是真正的泄漏,因为 sqlite3 正在为您处理内存。当您关闭数据库时(实际上 finalize 也应该清理它。),这一切都应该得到照顾。您可以验证以确保在您一遍又一遍地执行此操作后内存实际上并没有攀升。
-
感谢输入人...但它仍然让我无法接受...我认为最好将图像的路径而不是 blob 存储在 sqlite 中,并留下这一切一起。你说啥?我会在几个小时后尝试一下,然后告诉你。
标签: iphone memory-leaks instruments