首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >记忆管理方面的问题?

记忆管理方面的问题?
EN

Stack Overflow用户
提问于 2010-09-17 12:17:25
回答 4查看 185关注 0票数 0

我开发了一个应用程序,在其中我处理数据库操作。我在数据库类中编写的方法如下所示。

代码语言:javascript
复制
-(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;
}

上述代码在模拟器上运行良好,但在设备上不能工作。我还跟踪了内存泄漏,在其中我发现了上述方法代码中的内存泄漏。但我解决不了那个记忆泄漏。

现在,我还发现了以下方法中的内存泄漏。

  • (id)initWithString:(NSString *)str属性:(NSDictionary*)属性

{ if ((self = super )){ _buffer = str mutableCopy;_attributes = [NSMutableArray arrayWithObjects:ZAttributeRun属性return :0属性:attributes,nil];}返回self};

_buffer = str mutableCopy;而泄漏跟踪给了我在输出中不断增加的NSCFString字符串分配。我是怎么维持它的?

提前谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-09-17 12:27:22

内环泄漏NSMutableDictionary对象,因为添加到数组后应该对它们进行release,即

代码语言:javascript
复制
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];

另外,整个方法很可能会通过命名约定返回一个自动释放的对象。不确定这是否是泄漏-取决于如何调用该方法以及是否释放返回的值。

所以也许要用

代码语言:javascript
复制
return [dataArray autorelease];
票数 1
EN

Stack Overflow用户

发布于 2010-09-17 12:24:16

您的漏洞是,您既没有释放dataArray对象,也没有释放您在while循环中创建的可变字典。考虑自动释放可变数组,并在将字典添加到数组后手动释放它们。

至于为什么它“不工作”在设备上,你需要更具体的发生什么,为什么这不是你所期望的。

票数 2
EN

Stack Overflow用户

发布于 2010-09-17 12:25:56

乍一看,您有两个可能泄漏的地方:

代码语言:javascript
复制
NSMutableArray *dataArray = [[NSMutableArray alloc] init];
...
return dataArray;

调用方方法负责释放从方法返回的数组--检查它是否返回。

而且,您的方法名与obj-c准则不一致--它们建议返回非自动释放对象(因此调用方负责释放它们)的方法应该在其名称中包含创建、分配和复制。因此,最好返回自释放数组(从该方法返回return [dataArray autorelease];并让调用方决定是否需要保留数组)。

第二名是

代码语言:javascript
复制
[dataArray addObject:[[NSMutableDictionary alloc] init]];

它正在泄漏字典对象,您可能应该只编写

代码语言:javascript
复制
[dataArray addObject:[NSMutableDictionary dictionary]];
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3735226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档