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

Примите некоторые ответы. И исправить форматирование вашего кода, потому что оно нечитаемо. –

+0

Я исправил форматирование. – Sam

ответ

0

Вам действительно нужно ознакомиться с правилами памяти iPhone. Например

+(NSString *) urlDecode: (NSString *) url 
{ 
    NSString *result=[url stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
    return [result autorelease]; 
} 

Результат stringByReplacingPercentEscapesUsingEncoding уже autoreleased и вы autoreleasing его снова.

По возвращению, вы делаете это:

[cardTypeDTO setImageURL:[[CommonUtility urlDecode:[cardDetail objectForKey:@"imageURL"]] retain]] 

является setImageUrl синтезированного сохранить @property? Если это так, он уже вызывает сохранение.

cardTypeDTO имеет номер сохранения 1 и затем добавляется в словарь, который сохраняет его (setValue вызывает setObject, который отправляет сохранение).

Я написал, что может помочь:

http://loufranco.com/blog/files/managing-memory-iphone.html

Существует также связь там еще хорошее объяснение.

1

Я удивлен, что он работает на всех. Вы бросаете NSString в NSMutableDictionary, которые кажутся немного странными. Если это правильно, утечка может быть просто ложной позицией из-за необычного кода.

Я не вижу утечки в feedString, но я вижу один в cardTypeDTO. Вы закомментировали release, но это неверно.

+0

То, что вы подразумеваете под «утечкой», может быть просто ложным положительным из-за необычного кода ». и другое дело, я прокомментировал эту строку, потому что у меня есть пул autorelase, я изменил метод setValu на SetObject, но не повезло. – Sam

+0

Пул автореферации не имеет значения, поскольку cardTypeDTO не автореализован. –

+0

По ложным позициям я имею в виду, что ваш код может вводить в заблуждение Инструменты в мысли, что есть утечка в feedString, когда этого не происходит. Но вы не показываете, как определяется feedString, поэтому трудно быть уверенным. –

Смежные вопросы