2010-09-17 132 views
0

我正在开发一个应用程序,其中我使用数据库操作。我写在数据库类中的方法如下。内存问题?

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

{ 如果((个体= [超级INIT])) { _buffer = [STR mutableCopy ]。 _attributes = [NSMutableArray arrayWithObjects:[ZAttributeRun attributeRunWithIndex:0 attributes:attributes],nil]; } return self; }

_buffer = [str mutableCopy];附近的泄漏。并且泄漏跟踪让我在输出中连续增加NSCFString字符串分配。我如何维护它?

在此先感谢。

回答

1

你内环漏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]; 
+0

return [dataArray autorelease];我之前使用过的声明,但它没有奏效。首先它显示员工数据,当我从员工表中检索另一行时,它会给出“_kill”错误。 – Tirth 2010-09-17 13:14:38

+0

Thanks.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]; [字典发布]; 上面的存根很好地工作。 – Tirth 2010-09-17 13:35:58

2

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

至于为什么它在设备上“不起作用”,您需要更具体地了解发生了什么以及为什么这不是您所期望的。

+0

@Graham李,谢谢。你说dataArray释放应该手动。但是我们无法在return语句之前释放dataArray。如果我们在return语句之前释放dataArray,我们将从dataArray中释放所有对象吗? – Tirth 2010-09-17 13:49:09

+0

@rajb其实我说过你应该自动释放'dataArray',它可以避免你提出的问题(这确实是正确的)。 – 2010-09-17 14:03:39

+0

@ Graham Lee,Thanks.NSMutableArray * dataArray = [NSMutableArray array];这条线会自动释放自己的权利? – Tirth 2010-09-17 15:05:04

1

从第一眼你有2个地方的泄漏可以是:

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

来电方法负责释放阵列从方法返回 - 检查它。

此外,您的方法名称与obj-c指导方针不一致 - 它们建议返回非自动释放对象的方法(因此调用者负责释放它们)应该包含create,alloc和copy的名称。因此,它可以更好地从该方法返回自动释放阵列(return [dataArray autorelease];,让来电者决定是否需要保留阵列与否。

第二位的是

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

是漏水字典对象,你应该只写

[dataArray addObject:[NSMutableDictionary dictionary]]; 
0

你的方法有两个调用+alloc没有到-release-autorelease相应的调用。

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

可以重写这些行这样摆脱泄漏:

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

谢谢,请解释一下NSMutableArray * dataArray = [NSMutableArray array];并声明 NSMutableArray * dataArray = [[NSMutableArray alloc] init];? – Tirth 2010-09-17 13:51:05

+0

NSMutableArray * dataArray = [NSMutableArray array]; 声明现在工作良好。 – Tirth 2010-09-17 13:51:29

+0

'+ array'方法通过调用'[[[[[NSMutableArray alloc] init] autorelease]'返回创建的对象(概念上至少)。要熟悉内存管理,最好的方法是阅读Apple出色的内存管理指南:http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html – jlehr 2010-09-17 16:36:42