Iphone NSMutableDictionary中的内存泄漏

Iphone NSMutableDictionary中的内存泄漏,iphone,Iphone,当我运行instrument tool时,我会在下面几行中看到内存泄漏,“(NSString*)feedString”是我从服务器得到的JSON响应,有人能告诉我如何修复内存泄漏吗 谢谢, 山姆 NSMutableDictionary *allCards = [NSMutableDictionary dictionary]; CardTypeDTO *cardTypeDTO = [[CardTypeDTO alloc] init]; [cardTypeDTO setImageURL:

当我运行instrument tool时,我会在下面几行中看到内存泄漏,“(NSString*)feedString”是我从服务器得到的JSON响应,有人能告诉我如何修复内存泄漏吗

谢谢, 山姆

 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];
}
NSMutableDictionary*allCards=[NSMutableDictionary];
CardTypeDTO*CardTypeDTO=[[CardTypeDTO alloc]init];
[cardTypeDTO setImageURL:[[CommonUtility urlDecode:[cardDetail objectForKey:@“imageURL”]]保留]];
[allCards setValue:cardTypeDTO forKey:[cardDetail objectForKey:@“accountId]”;
-(id)parseFeed:(NSString*)feedString{
//NSMutableDictionary*allCards=[[NSMutableDictionary alloc]init];
NSMutableDictionary*allCards=[NSMutableDictionary];
NSMutableDictionary*parsedOutput=(NSMutableDictionary*)feedString;
NSArray*objectKeys=[parsedOutput allKeys];
对于(int i=0;i<[objectKeys计数];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:@“余额金额”];
[cardTypeDTO setPercentage:[cardDetail objectForKey:@“percentage”];
//[cardTypeDTO setImageURL:[cardDetail objectForKey:@“imageURL”];
[cardTypeDTO setImageURL:[[CommonUtility urlDecode:[cardDetail objectForKey:@“imageURL”]]保留]];
[cardTypeDTO setNickName:[cardDetail objectForKey:@“昵称”];
[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];
[循环池释放];
}
归还所有卡片;
}
+(NSString*)url解码:(NSString*)url
{
NSString*result=[url stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
返回[结果自动释放];
}

我很惊讶它居然能工作。您将
NSString
转换为
NSMutableDictionary
,这似乎有点奇怪。如果它是正确的,那么由于代码异常,泄漏可能只是误报


我在
feedString
中没有看到泄漏,但在
cardTypeDTO
中确实看到了泄漏。您已经注释掉了
版本
,但这是不正确的。

您确实需要查看iPhone内存规则。比如说

+(NSString *) urlDecode: (NSString *) url
{
   NSString *result=[url stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
   return [result autorelease];
}
StringByRePlacingPercentsEscapeSusingEncode的结果已经自动删除,您将再次自动删除它

在返回时,您可以执行以下操作:

[cardTypeDTO setImageURL:[[CommonUtility urlDecode:[cardDetail objectForKey:@"imageURL"]] retain]]
setImageUrl是合成的retain@属性吗?如果是这样,它已经调用retain

cardTypeDTO
具有retainCount 1,然后添加到保留它的字典中(setValue调用setObject,后者发送retain)

我写了这篇文章,这可能会有所帮助:


还有一个链接指向另一个好的解释。

接受一些答案。修复代码的格式,因为它是不可读的。你所说的“泄漏可能只是由于不寻常的代码而造成的误报。”还有一件事是我评论了那行,因为我有一个自动弹性池,我将setValu方法更改为SetObject,但没有成功。自动释放池与此无关,因为cardTypeDTO未自动释放。误报意味着您的代码可能会让工具误以为feedString中存在泄漏,而实际上没有。但是您没有说明feedString是如何定义的,所以很难确定。感谢所有的支持,我想知道这句话“自动释放池是不相关的,因为cardTypeDTO没有自动释放。”您能解释一下吗,我想您需要阅读更多关于目标C中内存管理的内容: