Instruments 说这种方法存在内存泄漏,但我不知道在哪里

Posted

技术标签:

【中文标题】Instruments 说这种方法存在内存泄漏,但我不知道在哪里【英文标题】:Instruments says there is a memory leak in this method, but I can't figure out where 【发布时间】: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 中,并留下这一切一起。你说啥?我会在几个小时后尝试一下,然后告诉你。 【参考方案1】:

在第一个代码示例中,您没有发布dataForCachedImage。您可以将其更改为

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.catName = (catName)?[NSString stringWithUTF8String:catName]:@"";
NSData *dataForCachedImage = [[[NSData alloc] initWithBytes:sqlite3_column_blob(statement, 2) length: sqlite3_column_bytes(statement, 2)] autorelease];           
cat.catThumb = [UIImage imageWithData:dataForCachedImage];

【讨论】:

在第一个示例中..我刚刚编写了仪器在方法中突出显示的代码....我在第二个示例中使用了整个方法...编辑帖子以反映相同跨度> 【参考方案2】:

好的.. 解决了!... 问题是 catThumb 没有在 Category 类中发布。就是这样!,无需其他修改...无论如何,谢谢大家!

【讨论】:

以上是关于Instruments 说这种方法存在内存泄漏,但我不知道在哪里的主要内容,如果未能解决你的问题,请参考以下文章

内存泄漏 Instruments Leak使用

内存泄漏检测

使用Xcode Instruments Leak解决内存泄漏问题

(转载)IOS- Instruments使用之使用Leaks检测内存泄漏

内存泄漏检测

跟踪内存泄漏