【发布时间】:2011-10-20 16:32:09
【问题描述】:
我正在开发一个大量使用 sqlite3 的应用程序,但我面临着巨大的内存泄漏问题。
每次我调用进行选择的方法时,当我将对象添加到数组时都会发生内存泄漏。
- (void) makeSitesSelect:(NSString *)dbPath:(NSString *)theSelect {
allSitesSelect = [[NSMutableArray alloc] init];
sqlite3 *database;
if (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) {
const char *sql = [theSelect cStringUsingEncoding:NSASCIIStringEncoding];
sqlite3_stmt *selectstmt;
if(sqlite3_prepare_v2(database, sql, -1, &selectstmt, NULL) == SQLITE_OK) {
while(sqlite3_step(selectstmt) == SQLITE_ROW) {
NSMutableArray *selResult = [[NSMutableArray alloc] init]; // <---- Memory leak
NSInteger selprimaryKey = sqlite3_column_int(selectstmt, 0);
[selResult addObject:[NSString stringWithFormat:@"%i", selprimaryKey]]; //<--- memory leak
const unsigned char *chsiteSite = sqlite3_column_text(selectstmt, 1);
const unsigned char *chsiteCity = sqlite3_column_text(selectstmt, 2);
const unsigned char *chsiteCountry = sqlite3_column_text(selectstmt, 3);
const unsigned char *chsiteGPS = sqlite3_column_text(selectstmt, 4);
if (chsiteSite != NULL) {
[selResult addObject:[NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 1)]]; //<--- memory leak
}
else {
[selResult addObject:@""];
}
if (chsiteCity != NULL) {
[selResult addObject:[NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 2)]]; //<---- memory leak
}
else {
[selResult addObject:@""];
}
if (chsiteCountry != NULL) {
[selResult addObject:[NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 3)]]; //<---- memory leak
}
else {
[selResult addObject:@""];
}
if (chsiteGPS != NULL) {
[selResult addObject:[NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 4)]]; //<---- memory leak
}
else {
[selResult addObject:@""];
}
[allSitesSelect addObject:selResult];
[selResult release];
}
sqlite3_finalize(selectstmt);
}
sqlite3_close(database);
}
else
sqlite3_close(database); //Even though the open call failed, close the database connection to release all the memory.
}
感谢任何帮助。
谢谢, 最大
【问题讨论】:
-
尝试将其分配到while循环之外....tat is b4 while-loop
-
quote: “我正在开发一个大量使用 sqlite3 的应用程序”...你考虑过 Core Data 吗?您应该尝试一下,它简单易学且非常高效!
-
@booleanBoy:我无法在 while 循环之外分配 selResult,因为我必须在每个“圈”处清空 e 重新初始化它。
-
daveoncode: 可能很好,但我正在更新一个已经发布的应用程序,我会添加数千行从 sqlite 移动到 CoreData 没有问题,因为所有用户已经使用我的应用程序。
-
为什么那行是内存泄漏? [selResult addObject:[NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 1)]]; //
标签: iphone memory memory-leaks sqlite