Objective-C中的简单内存管理问题

时间:2010-09-06 00:30:51

标签: objective-c sqlite memory memory-leaks

我的程序中存在内存泄漏,因为我不熟悉C(在Objective-C类中创建了一个从SQLite数据库加载字符串的函数)。谁能发现我的错误?谢谢你:

static int MyCallback(void *context, int lCount, char **values, char **columns){

NSMutableArray *sqlRawStrings = (NSMutableArray *)context;
for (int i = 0; i < lCount; i++) {
    const char *nameCString = values[i];
    if (nameCString != NULL) {
        [sqlRawStrings addObject:[NSString stringWithUTF8String:nameCString]];
    }
} 

return SQLITE_OK;

}

所有这些都在这里提到:

int numberA = [loadBundleNumber intValue];
char str1[130] = "select ";
for(int i = 7; i <7 + numberA; i++){
    str1[i] = 'a';
}
char str2[20] = " from puzzles";
strcat(str1,str2);

NSString *file = [[NSBundle mainBundle] pathForResource:@"finalPuzzles" ofType:@"db"];
sqlite3 *database = NULL;
if (sqlite3_open([file UTF8String],&database) == SQLITE_OK) {
    sqlite3_exec(database, str1, MyCallback, sqlRawStrings, NULL);
}
sqlite3_close(database);

由于

2 个答案:

答案 0 :(得分:0)

更多评论而不是答案,因为我还没有看到你如何泄漏记忆(还没有足够的评论来评论)。您是如何观察内存泄漏的?你能看到被泄漏的对象里面有什么东西,然后通过它的分配堆栈跟踪来查看它是什么吗?

您也可以提供sqlRawStrings的声明吗?

顺便说一句,我认为你构建字符串的方式可以改进。考虑使用sprintf。您可能还想考虑使用.mm文件而不是.m,然后您将获得C ++功能; std :: string类可以帮到你。

最后,除非您已成功打开它,否则不要关闭某些内容,即“sqlite3_close”应与sqlite3_exec位于同一块内。

'希望这有用。

答案 1 :(得分:0)

最好的猜测是sqlRawStrings永远不会被释放,因此也没有添加任何内容。