[英]Memory leaks in NSMutableDictionary
當我運行儀器工具時,我在以下幾行中遇到內存泄漏,“(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]; }
我很驚訝它的工作原理。 您將NSString
轉換為NSMutableDictionary
似乎有點奇怪。 如果正確,則由於異常代碼,泄漏可能只是假陽性。
我沒有看到泄漏feedString
但我確實看到了一個在cardTypeDTO
。 您已經注釋了該release
但這是不正確的。
您確實需要查看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
具有keepCount 1,然后將其添加到保留它的字典中(setValue調用setObject,發送保留)。
我寫了這個,可能會有所幫助:
http://loufranco.com/blog/files/managing-memory-iphone.html
還有一個鏈接到另一個很好的解釋。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.