我开发了一个应用程序,在其中我处理数据库操作。我在数据库类中编写的方法如下所示。
-(NSMutableArray *)getData: (NSString *)dbPath{
NSMutableArray *dataArray = [[NSMutableArray alloc] init];
if(sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK){
NSString *sqlQuery = [NSString stringWithFormat:@"SELECT empID, addText FROM Employee WHERE nameID = %@", nameID];
sqlite3_stmt *selectstmt;
if(sqlite3_prepare_v2(database, [sqlQuery UTF8String], -1, &selectstmt, NULL) == SQLITE_OK){
while (sqlite3_step(selectstmt) == SQLITE_ROW){
[dataArray addObject:[[NSMutableDictionary alloc] init]];
[[dataArray lastObject] setObject:[NSString
stringWithFormat:@"%d", sqlite3_column_int(selectstmt, 0)] forKey:@"empID"];
[[dataArray lastObject] setObject:[NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt,1)] forKey:@"addText"];
}
}
sqlite3_finalize(selectstmt);
}
sqlite3_close(database);
return dataArray;
}上述代码在模拟器上运行良好,但在设备上不能工作。我还跟踪了内存泄漏,在其中我发现了上述方法代码中的内存泄漏。但我解决不了那个记忆泄漏。
现在,我还发现了以下方法中的内存泄漏。
{ if ((self = super )){ _buffer = str mutableCopy;_attributes = [NSMutableArray arrayWithObjects:ZAttributeRun属性return :0属性:attributes,nil];}返回self};
_buffer = str mutableCopy;而泄漏跟踪给了我在输出中不断增加的NSCFString字符串分配。我是怎么维持它的?
提前谢谢。
发布于 2010-09-17 12:27:22
内环泄漏NSMutableDictionary对象,因为添加到数组后应该对它们进行release,即
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
[dict setObject:[NSString stringWithFormat:@"%d", sqlite3_column_int(selectstmt, 0)] forKey:@"empID"];
[dict setObject:[NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt,1)] forKey:@"addText"];
[dataArray addObject:dict];
[dict release];另外,整个方法很可能会通过命名约定返回一个自动释放的对象。不确定这是否是泄漏-取决于如何调用该方法以及是否释放返回的值。
所以也许要用
return [dataArray autorelease];发布于 2010-09-17 12:24:16
您的漏洞是,您既没有释放dataArray对象,也没有释放您在while循环中创建的可变字典。考虑自动释放可变数组,并在将字典添加到数组后手动释放它们。
至于为什么它“不工作”在设备上,你需要更具体的发生什么,为什么这不是你所期望的。
发布于 2010-09-17 12:25:56
乍一看,您有两个可能泄漏的地方:
NSMutableArray *dataArray = [[NSMutableArray alloc] init];
...
return dataArray;调用方方法负责释放从方法返回的数组--检查它是否返回。
而且,您的方法名与obj-c准则不一致--它们建议返回非自动释放对象(因此调用方负责释放它们)的方法应该在其名称中包含创建、分配和复制。因此,最好返回自释放数组(从该方法返回return [dataArray autorelease];并让调用方决定是否需要保留数组)。
第二名是
[dataArray addObject:[[NSMutableDictionary alloc] init]];它正在泄漏字典对象,您可能应该只编写
[dataArray addObject:[NSMutableDictionary dictionary]];https://stackoverflow.com/questions/3735226
复制相似问题