2010-07-30 42 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