2012-03-01 94 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

我在這段代碼中沒有看到任何泄漏。

儀器會告訴您哪個對象正在泄漏以及它的分配位置。該分配不一定是泄漏的地方。

所以:你在哪裏使用該陣列中的物品?某處,您保留了陣列中的一個項目而未釋放它。 (或者可能是整個陣列)。