2012-03-01 103 views
0

还有另一个泄漏问题。我有一个方法:方法泄漏对象

-(NSMutableArray*)returnItems:(int)nominalID subCountryID:(int)subCountryID 
{ 
NSArray *paths = 
NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *path = 
[documentsDirectory stringByAppendingPathComponent:databaseName]; 

NSMutableArray *itemsArray=[[[NSMutableArray alloc]init]autorelease]; 

if (sqlite3_open([path UTF8String], &database) == SQLITE_OK) 
{ 
    const char *sqlItems=sqlite3_mprintf("SELECT itm.itemID,itm.itemYear,itm.rarity,itm.mintage,iaval.availability as avalibility,iaval.quality as quality,itm.Mintmark,itm.specialRemark,iaval.dated\ 
             from items as itm\ 
             inner join itemAvailability as iaval on itm.itemID=iaval.itemID\ 
             INNER join NominalsAndSubcountriesRelation as nasr on nasr.nominalID=itm.relatedToNominal\ 
             WHERE nasr.nominalID=%i AND nasr.subCountryID=%i",nominalID,subCountryID); 

sqlite3_stmt *statement; 
int sqlResult = sqlite3_prepare_v2(database, sqlItems, -1, &statement, NULL); 
if (sqlResult== SQLITE_OK) 
{ 
    while (sqlite3_step(statement) == SQLITE_ROW) 
    { 
     Item *item=[[Item alloc]init]; 
     item.itemID=sqlite3_column_int(statement, 0); 
     char *itemYear=(char *)sqlite3_column_text(statement, 1); 
     item.rarity=sqlite3_column_int(statement, 2); 
     char *mintage=(char *)sqlite3_column_text(statement, 3); 
     item.availability=sqlite3_column_int(statement, 4); 
     item.quality=sqlite3_column_int(statement, 5); 
     char *mintmark=(char *)sqlite3_column_text(statement, 6); 
     char *specialRemark=(char*)sqlite3_column_text(statement, 7); 
     char *dated=(char*)sqlite3_column_text(statement, 8); 
     item.itemYear=(itemYear)?[NSString stringWithUTF8String:itemYear]:@""; 
     item.mintage=(mintage)?[NSString stringWithUTF8String:mintage]:@"Unknown"; 
     item.mintmark=(mintmark)?[NSString stringWithUTF8String:mintmark]:@""; 
     item.specialRemark=(specialRemark)?[NSString stringWithUTF8String:specialRemark]:@""; 
     item.dated=(dated)?[NSString stringWithUTF8String:dated]:@""; 
     [itemsArray addObject:item]; 
     [item release]; 
    } 
    sqlite3_finalize(statement); 
    sqlite3_free((char*)sqlItems); 
} 
} 
else 
{ 
    [self dbConnectionError]; 
} 

    return itemsArray; 
} 

仪器工具声称有100%的项目对象泄漏。它出什么问题了?

回答

1

在你出现的代码中没有任何错误出现; item被添加到itemsArray后被释放,itemsArray被自动释放,因此作为非拥有参考返回。

因此,您应该假设收到itemsArray的人正在保留它并未能释放它。

1

我在这段代码中没有看到任何泄漏。

仪器会告诉您哪个对象正在泄漏以及它的分配位置。该分配不一定是泄漏的地方。

所以:你在哪里使用该阵列中的物品?某处,您保留了阵列中的一个项目而未释放它。 (或者可能是整个阵列)。