内存泄漏问题?

时间:2010-12-07 12:29:30

标签: ipad

我如何从以下代码段发布dataArray,

+(NSMutableArray *)getData: (NSString *)dbPath
{

    NSMutableArray *_dataArray = [[NSMutableArray alloc] init];
    if(sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK)
    {
        NSString *sqlQuery = [NSString stringWithFormat:@"SELECT DISTINCT name FROM databaseTable"];
        sqlite3_stmt *selectstmt;
        if(sqlite3_prepare_v2(database, [sqlQuery UTF8String], -1, &selectstmt, NULL) == SQLITE_OK)
        {
            while (sqlite3_step(selectstmt) == SQLITE_ROW)
            {
                [_dataArray addObject:[NSString stringWithFormat:@"%d", sqlite3_column_int(selectstmt, 0)]];
            }
        }
        sqlite3_finalize(selectstmt);
    }
    sqlite3_close(database);
    return _dataArray;
}

上面的方法给我带来了内存泄漏,这给我的应用程序的未来工作带来了严重的问题。

2 个答案:

答案 0 :(得分:3)

return [_dataArray autorelease];

如果要返回保留的对象,则需要按照命名约定将其清除。该方法应该以new,create或copy开头。否则你应该返回一个自动释放的对象。

答案 1 :(得分:1)

我发现您发布的代码中没有任何明显的泄漏。该函数返回已分配的NSMutableArray,因此调用者将负责稍后调用release。或者,您可以选择将其设为autorelease对象。

另外,您可能只想在sqlite3_open()成功时调用sqlite3_close()(即将sqlite3_close()移动到第一个if语句内的 )。 sqlite3_finalize()的想法相同。

SQLite会隐式执行一些一次性初始化,但您不必担心这一点。检查文档:

int sqlite3_initialize(void);
int sqlite3_shutdown(void);

什么类型的物品被报告为泄漏?