Quelqu'un peut-il aider à signaler les fuites de mémoire? Je reçois un tas dans cette méthode et je ne suis pas sûr exactement comment y remédier.Fuites de mémoire - Objective-C
- (NSMutableArray *)getTop5AndOtherKeysAndValuesFromDictionary:(NSMutableDictionary *)dict {
NSLog(@"get top 5");
int sumOfAllValues = 0;
NSMutableArray *arr = [[[NSMutableArray alloc] init] retain];
for(NSString *key in dict){
NSString *value = [[dict objectForKey:key] retain];
[arr addObject:value];
sumOfAllValues += [value intValue];
}
//sort values
NSArray *sorted = [[arr sortedArrayUsingFunction:sort context:NULL] retain];
[arr release];
//top 5 values
int sumOfTop5 = 0;
NSMutableArray *top5 = [[[NSMutableArray alloc] init] retain];
for(int i = 0; i < 5; i++) {
int proposedIndex = [sorted count] - 1 - i;
if(proposedIndex >= 0) {
[top5 addObject:[sorted objectAtIndex:([sorted count] - i - 1)]];
sumOfTop5 += [[sorted objectAtIndex:([sorted count] - i - 1)] intValue];
}
}
[sorted release];
//copy of all keys
NSMutableArray *copyOfKeys = [[[NSMutableArray alloc] init] retain];
for(NSString *key in dict) {
[copyOfKeys addObject:key];
}
//copy of top 5 values
NSMutableArray *copyOfTop5 = [[[NSMutableArray alloc] init] retain];
for(int i = 0; i < [top5 count]; i++) {
[copyOfTop5 addObject:[top5 objectAtIndex:i]];
}
//get keys with top 5 values
NSMutableArray *outputKeys = [[[NSMutableArray alloc] init] retain];
for(int i = 0; i < [top5 count]; i++) {
NSString *targetValue = [top5 objectAtIndex:i];
for(int j = 0; j < [copyOfKeys count]; j++) {
NSString *key = [copyOfKeys objectAtIndex:j];
NSString *val = [dict objectForKey:key];
if([val isEqualToString:targetValue]) {
[outputKeys addObject:key];
[copyOfKeys removeObjectAtIndex:j];
break;
}
}
}
[outputKeys addObject:@"Other"];
[top5 addObject:[[NSString stringWithFormat:@"%d",(sumOfAllValues - sumOfTop5)] retain]];
NSMutableArray *output = [[NSMutableArray alloc] init];
[output addObject:outputKeys];
[output addObject:top5];
NSMutableArray *percents = [[NSMutableArray alloc] init];
int sum = sumOfAllValues;
float leftOverSum = sum * 1.0f;
int count = [top5 count];
float val1, val2, val3, val4, val5;
if(count >= 1)
val1 = ([[top5 objectAtIndex:0] intValue] * 1.0f)/sum;
else
val1 = 0.0f;
if(count >=2)
val2 = ([[top5 objectAtIndex:1] intValue] * 1.0f)/sum;
else
val2 = 0.0f;
if(count >= 3)
val3 = ([[top5 objectAtIndex:2] intValue] * 1.0f)/sum;
else
val3 = 0.0f;
if(count >= 4)
val4 = ([[top5 objectAtIndex:3] intValue] * 1.0f)/sum;
else
val4 = 0.0f;
if(count >=5)
val5 = ([[top5 objectAtIndex:4] intValue] * 1.0f)/sum;
else
val5 = 0.0f;
if(val1 >= .00001f) {
NSMutableArray *a1 = [[NSMutableArray alloc] init];
[a1 addObject:[outputKeys objectAtIndex:0]];
[a1 addObject:[top5 objectAtIndex:0]];
[a1 addObject:[NSString stringWithFormat:@"%.01f",(val1*100)]];
[percents addObject:a1];
leftOverSum -= ([[top5 objectAtIndex:0] intValue] * 1.0f);
}
if(val2 >= .00001f) {
NSMutableArray *a2 = [[NSMutableArray alloc] init];
[a2 addObject:[outputKeys objectAtIndex:1]];
[a2 addObject:[top5 objectAtIndex:1]];
[a2 addObject:[NSString stringWithFormat:@"%.01f",(val2*100)]];
[percents addObject:a2];
leftOverSum -= ([[top5 objectAtIndex:1] intValue] * 1.0f);
}
if(val3 >= .00001f) {
NSMutableArray *a3 = [[NSMutableArray alloc] init];
[a3 addObject:[outputKeys objectAtIndex:2]];
[a3 addObject:[top5 objectAtIndex:2]];
[a3 addObject:[NSString stringWithFormat:@"%.01f",(val3*100)]];
[percents addObject:a3];
leftOverSum -= ([[top5 objectAtIndex:2] intValue] * 1.0f);
}
if(val4 >= .00001f) {
NSMutableArray *a4 = [[NSMutableArray alloc] init];
[a4 addObject:[outputKeys objectAtIndex:3]];
[a4 addObject:[top5 objectAtIndex:3]];
[a4 addObject:[NSString stringWithFormat:@"%.01f",(val4*100)]];
[percents addObject:a4];
leftOverSum -= ([[top5 objectAtIndex:3] intValue] * 1.0f);
}
if(val5 >= .00001f) {
NSMutableArray *a5 = [[NSMutableArray alloc] init];
[a5 addObject:[outputKeys objectAtIndex:4]];
[a5 addObject:[top5 objectAtIndex:4]];
[a5 addObject:[NSString stringWithFormat:@"%.01f",(val5*100)]];
[percents addObject:a5];
leftOverSum -= ([[top5 objectAtIndex:4] intValue] * 1.0f);
}
float valOther = (leftOverSum/sum);
if(valOther >= .00001f) {
NSMutableArray *a6 = [[NSMutableArray alloc] init];
[a6 addObject:[outputKeys objectAtIndex:5]];
[a6 addObject:[top5 objectAtIndex:5]];
[a6 addObject:[NSString stringWithFormat:@"%.01f",(valOther*100)]];
[percents addObject:a6];
}
[output addObject:percents];
NSLog(@"mu - a");
//[arr release];
NSLog(@"mu - b");
//[copyOfKeys release];
NSLog(@"mu - c");
//[copyOfTop5 release];
NSLog(@"mu - c");
//[outputKeys release];
//[top5 release];
//[percents release];
return output;
}
Je suis +1 parce que vous avez réellement parcouru son code et essayé d'expliquer pourquoi il est faux. Une chose que je suggérerais FORTEMENT pour l'avenir de cette question est d'expliquer quand un développeur veut retenir. Il a fait l'erreur de l'utiliser, ce qui signifie que son utilisation n'était pas claire. Si vous pouvez modifier votre réponse avec une heure et un lieu à retenir, je crois que vous serez la réponse acceptée. –