簡體   English   中英

NSMutableDictionary中的內存泄漏

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM