Утечки из ниоткуда, что я делаю не так? - PullRequest
0 голосов
/ 10 марта 2011

У меня настоящая проблема с выпуском и утечками. У меня есть массив, который просто не перестанет течь! вот мой код: Я объявил otherValuesArray в .h Я пробовал сотни разных способов, включая авто-релиз.

Может кто-нибудь сказать мне, что я делаю не так? Спасибо

otherValuesArray = [[NSMutableArray array] retain]; //89% leak

NSString *tempString;
tempString = [[NSString stringWithFormat:@"%d",challengeID] autorelease];
[otherValuesArray addObject:[NSString stringWithString:tempString]]; // 11% leak
tempString=nil;

tempString = [[NSString stringWithFormat:@"%d",scoreMultiQuant] autorelease];
[otherValuesArray addObject:[NSString stringWithString:tempString]];
tempString=nil;

int challengeDoneTemp = [challenges otherValues:otherValuesArray];

tempString=nil;
[tempString release];

otherValuesArray = nil;
[otherValuesArray release];

Ответы [ 2 ]

6 голосов
/ 10 марта 2011

Поменяйте местами последние две строки.После установки otherValuesArray на ноль, нет смысла отправлять ему сообщение об освобождении.Это уже ноль, поэтому релиз не имеет никакого эффекта.Таким образом, вы теряете эту память, поскольку она не освобождается.Правильный код будет,

[otherValuesArray release];   // first release
otherValuesArray = nil;   // then set to nil

А также stringWithFormat уже автоматически выпущен.Таким образом, вам не нужно отправлять это сообщение авто-релиз.Вы получаете утечку из-за утечки контейнера otherValuesArray.

А также (хотя это и не связано с утечкой), вам вообще не нужен tempString.Вы можете сделать это в одну строку:

[otherValuesArray addObject:[NSString stringWithFormat:@"%d",challengeID]];
2 голосов
/ 10 марта 2011

есть ряд проблем с управлением памятью, как указал taskinoor.

вот упрощенная форма программы:

NSMutableArray * tmp = [NSMutableArray new];
[tmp addObject:[NSString stringWithFormat:@"%d",challengeID]];
[tmp addObject:[NSString stringWithFormat:@"%d",scoreMultiQuant]];
assert(challenges);
int challengeDoneTemp = [challenges otherValues:tmp];
self.otherValuesArray = tmp;
[tmp release], tmp = 0;
...