嗨,大家好,希望你能提供帮助。我正在尝试为iPhone应用程序创建一个anagram检查器。我想要做的是能够获取最多81个字母的长串,然后在单词列表中检查这个字符以查找任何长度的所有可能的排列。
我已经想出如何在模拟器上执行此操作,但是当我在iPhone上运行它时,它非常慢,大约需要90秒来循环遍历整个数据库(大约110000行)。我检查了仪器,它没有显示任何内存泄漏。但是,当我使用对象分配时,很明显运行查询会为CFString创建一个大量分配,从而消耗其他所有内容。这会立即在整个字节列下运行3.09 MB。 (在下面的代码中,我已经删除了所有的字谜检查代码,因为我想确定导致问题的原因。所以这一切目前都是通过数据库循环而没有任何输出。)
//create query
NSString *querySQL2 = @"SELECT name FROM table ";
sqlite3_stmt *statement2;
const char *query_stmt2 = [querySQL2 UTF8String];
sqlite3_prepare_v2(contactDB, query_stmt2, -1, &statement2, NULL);
//loop through all rows of database
while (sqlite3_step(statement2) == SQLITE_ROW)
{
NSString *laststring = [[NSString alloc] initWithUTF8String:
(const char *) sqlite3_column_text(statement2, 0)];
[laststring release];
}
sqlite3_finalize(statement2);
sqlite3_close(contactDB);
}
对我来说,在下面创建'laststring'似乎是在吸取所有记忆。那么为什么当我放[laststring release]时呢?在while循环结束时它似乎没有效果?我在运行和不运行时运行此代码,并且使用了相同数量的内存。我也试过在它周围包装自动释放,这也没有效果。
我已经阅读了几个关于循环SQLite的其他查询。他们中的一些人建议建立索引,但我不确定这会为我节省大量的时间来解决这个问题。此外,如果我从一大串81个字母中搜索所有可能的排列,我猜测至少需要检查50%的单词列表。
有关如何保持CFString的任何建议? 非常感谢 戴夫
答案 0 :(得分:-1)
为什么要在while()循环中分配NSString?
while(sqlite3_step(compiledStatement) == SQLITE_ROW)
{
NSString *laststring = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement2, 0)];
// do something with laststring
}
就足够了吗?