2010-07-30 58 views
0

當我運行儀器工具我得到內存泄漏在下面的行,「(NSString *)feedString」是我從服務器獲得的JSON響應,可以任何人給和想法怎麼可以解決這個內存泄露,內存泄漏在NSMutableDictionary

感謝, 山姆,

NSMutableDictionary *allCards = [NSMutableDictionary dictionary]; 

CardTypeDTO *cardTypeDTO = [[CardTypeDTO alloc] init]; 

    [cardTypeDTO setImageURL:[[CommonUtility urlDecode:[cardDetail objectForKey:@"imageURL"]] retain]]; 

    [allCards setValue:cardTypeDTO forKey:[cardDetail objectForKey:@"accountId"]]; 



-(id)parseFeed:(NSString *)feedString{ 

//NSMutableDictionary *allCards = [[NSMutableDictionary alloc] init]; 
NSMutableDictionary *allCards = [NSMutableDictionary dictionary]; 


NSMutableDictionary *parsedOutput = (NSMutableDictionary *)feedString; 

NSArray *objectKeys = [parsedOutput allKeys]; 


for (int i = 0; i < [objectKeys count]; i++) { 
    NSAutoreleasePool *loopPool = [[NSAutoreleasePool alloc] init]; 
    NSMutableDictionary *cardDetail = [parsedOutput objectForKey:[objectKeys objectAtIndex:i]]; 
    CardTypeDTO *cardTypeDTO = [[CardTypeDTO alloc] init]; 
    [cardTypeDTO setAccountId:[cardDetail objectForKey:@"accountId"]]; 
    [cardTypeDTO setCardName:[cardDetail objectForKey:@"cardName"]]; 
    [cardTypeDTO setBankName:[cardDetail objectForKey:@"bankName"]]; 
    [cardTypeDTO setCustomMessage:[cardDetail objectForKey:@"customMessage"]]; 
    [cardTypeDTO setAvailableAmount:[cardDetail objectForKey:@"availableAmount"]]; 
    [cardTypeDTO setBalanceAmount:[cardDetail objectForKey:@"balanceAmount"]]; 
    [cardTypeDTO setPercentage:[cardDetail objectForKey:@"percentage"]]; 
    //[cardTypeDTO setImageURL:[cardDetail objectForKey:@"imageURL"]]; 
    [cardTypeDTO setImageURL:[[CommonUtility urlDecode:[cardDetail objectForKey:@"imageURL"]] retain]]; 
    [cardTypeDTO setNickName:[cardDetail objectForKey:@"nickName"]]; 
    [cardTypeDTO setBalanceStatusCode:[cardDetail objectForKey:@"balanceStatusCode"]]; 
    [cardTypeDTO setBalanceStatusMsg:[cardDetail objectForKey:@"balanceStatusMsg"]]; 
    [cardTypeDTO setOnlineLinked:[cardDetail objectForKey:@"onlineLinked"]]; 
    [cardTypeDTO setCardType:[cardDetail objectForKey:@"cardType"]]; 

    [allCards setValue:cardTypeDTO forKey:[cardDetail objectForKey:@"accountId"]]; 
    //[cardTypeDTO release]; 
    [loopPool release]; 

} 

return allCards; 
} 

+(NSString *) urlDecode: (NSString *) url 
{ 
NSString *result=[url stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
return [result autorelease]; 
} 

+0

接受一些答案。並修復你的代碼的格式,因爲它是不可讀的。 – 2010-07-30 10:22:17

+0

我修正了格式。 – Sam 2010-07-30 10:32:01

回答

0

您確實需要查看iPhone內存規則。例如

+(NSString *) urlDecode: (NSString *) url 
{ 
    NSString *result=[url stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
    return [result autorelease]; 
} 

stringByReplacingPercentEscapesUsingEncoding的結果已經自動釋放並且再次自動釋放它。

在返回的,你這樣做:

[cardTypeDTO setImageURL:[[CommonUtility urlDecode:[cardDetail objectForKey:@"imageURL"]] retain]] 

是setImageUrl合成保留@property?如果是這樣,它已經調用保留。

cardTypeDTO擁有retainCount 1,然後被添加到保留它的字典中(setValue調用setObject,它發送retain)。

我寫了這一點,這可能幫助:

http://loufranco.com/blog/files/managing-memory-iphone.html

還有有一個鏈接到另一個很好的解釋。

1

我很驚訝,它在所有工作。您將NSString投射到NSMutableDictionary,這似乎有點奇怪。如果這是正確的,由於不尋常的代碼,泄漏可能只是一個誤報。

我在feedString中看不到泄漏,但我在cardTypeDTO中看到一處泄漏。您已將release註釋掉,但這不正確。

+0

你的意思是「由於不尋常的代碼,泄漏可能只是一個誤報。」和其他的事情是我評論該行,因爲我有一個autorelase池,我改變setValu方法SetObject但沒有運氣。 – Sam 2010-07-30 10:55:28

+0

由於cardTypeDTO未被自動釋放,autorelease池無關緊要。 – 2010-07-30 11:01:24

+0

由於誤報,我的意思是說你的代碼可能會讓人感到困惑,因爲如果沒有的話,你可能會認爲feedString中存在泄漏。但是你不會顯示feedString是如何定義的,所以很難確定。 – 2010-07-30 11:03:40