应用程序崩溃 - 分配实时字节数达到20 MB

时间:2010-07-30 17:51:23

标签: iphone memory-leaks

当我使用Leaks工具运行时,我的iphone应用程序有很多按钮(我用按钮创建了日历视图) - 没有发现泄漏。但不知何故,Allocation Live Bytes达到21MB且应用程序崩溃(点击按钮约120次)。

不再使用系统自动释放内存......如果没有泄漏,内存如何继续增加?任何关于如何处理这个问题的想法将不胜感激。感谢。

我在我的应用程序中使用sqlite3加载(日历 - 值一次保存30天的商店) - 调用函数getSingRecord 30次...下面是实际代码

-(void) insertRecordIntoTableNamed:
{

NSString *sql="Insert Statement......";

char *err;

if (sqlite3_exec(db, [sql UTF8String], NULL, NULL, &err) != SQLITE_OK) {
    sqlite3_close(db);
    NSAssert(0,@"Error updating table");
}

}

-(NSString *) getSingRecord: (NSString *) getStatement{

NSString *sql=getStatement;

sqlite3_stmt *statement;

NSString *fieldFlagI=@"0";

if (sqlite3_prepare_v2(db, [sql UTF8String], -1, &statement, nil) == SQLITE_OK) {
    while (sqlite3_step(statement) == SQLITE_ROW) {
        char *fieldFlag=(char *) sqlite3_column_text(statement, 0);
        fieldFlagI=[[NSString alloc] initWithUTF8String:fieldFlag];
        //fieldFlagI=[NSString initWithUTF8String:fieldFlag];
    }
    sqlite3_finalize(statement);
}
//NSString *ffI=fieldFlagI;
//[fieldFlagI release]
return [fieldFlagI autorelease];
} 

2 个答案:

答案 0 :(得分:1)

你很可能依赖的是一个永不消耗的自动释放池。由于池存在并保留您的对象,因此工具不会将此检测为内存泄漏。如果你永远不会耗尽游泳池,你分配的所有物品即使在你完成之后也会保持活力。

答案 1 :(得分:0)

泄漏是没有人引用的对象,但是没有发布。如果您将对象保留在数据结构中并保持它们,那么这不会被视为泄漏,但这是一个问题。你按下按钮怎么办?

更新:根据您的代码

不要自动释放返回 - 你并不总是分配它(初始化为@“0”),只有在你分配它时才自动释放。

但那不是你的泄密。

在while()中,每次循环时,都会泄漏你分配的最后一个 - 你的get语句肯定会返回一行吗?如果是这样,为什么一会儿()?