我如何从以下代码段发布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;
}
上面的方法给我带来了内存泄漏,这给我的应用程序的未来工作带来了严重的问题。
答案 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);
什么类型的物品被报告为泄漏?