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