代码之家  ›  专栏  ›  技术社区  ›  Tirth

内存管理有问题吗?

  •  0
  • Tirth  · 技术社区  · 14 年前

    -(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 attributes:(NSDictionary*)属性

    { if((self=[super init])) { _buffer=[str mutableCopy]; _attributes=[NSMutableArray数组WithObjects:[ZAttributeRun attributeRun]WithIndex:0属性:attributes],nil]; } 回归自我;

    在_buffer=[str mutableCopy];附近的泄漏;。而leak trace在输出中给了我不断增加的NSCFString字符串分配。我怎么保养?

    提前谢谢。

    4 回复  |  直到 14 年前
        1
  •  1
  •   Eiko    14 年前

    你的内环泄漏了 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];
    
        2
  •  2
  •   user23743 user23743    14 年前

    你的漏洞是你不释放 dataArray while 循环。考虑自动释放可变数组,并在将字典添加到数组后手动释放它们。

    至于为什么它在设备上“不起作用”,你需要更具体一些 什么

        3
  •  1
  •   Vladimir    14 年前

    乍一看,有两个地方可能存在泄漏:

    NSMutableArray *dataArray = [[NSMutableArray alloc] init];
    ...
    return dataArray;
    

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

    return [dataArray autorelease]; 并让调用者决定是否需要保留数组。

    第二名是

    [dataArray addObject:[[NSMutableDictionary alloc] init]];
    

    [dataArray addObject:[NSMutableDictionary dictionary]];
    
        4
  •  0
  •   jlehr    14 年前

    您的方法包含两个 +alloc 没有相应的呼叫 -release -autorelease .

    NSMutableArray *dataArray = [[NSMutableArray alloc] init];
    ...
    [dataArray addObject:[[NSMutableDictionary alloc] init]];
    

    您可以这样重写这些行以消除泄漏:

    NSMutableArray *dataArray = [NSMutableArray array];
    ...
    [dataArray addObject:[NSMutableDictionary dictionary]];