My coding contains a memory leak, and somehow I can't find the leak.

Leaks points me in the direction of the way I create "ReportDetailItems"

e.g. areaContainer = [[[ReportDetailItem alloc] init] autorelease];

I've been looking at this for hours and I am at a total loss, the objects reported leaking are "ReportDetailItem", and the NSMutableDictionary contained in those objects.

Please advice.

------[ReportDetailItem.h

```
@interface ReportDetailItem : NSObject
{
    NSNumber *total;
    NSMutableDictionary *items;

}

@property (nonatomic, retain) NSNumber *total;
@property (nonatomic, retain) NSMutableDictionary *items;

- (NSString *)description;

@end

```

------[ReportDetailItem.m

```
@synthesize items, total;

- (id)init {
    if (self = [super init]) {
        self.items = [NSMutableDictionary dictionaryWithCapacity:0];
        DLog("Alloc: %d", [items retainCount]);
    }   

    return self;
}

- (NSString *)description {
    return @"ReportDetailItem";
}

- (void)release {
    [super release];
}

- (void)dealloc {
    [self.items release];
    [self.total release];

    items = nil;
    total = nil;

    [super dealloc];
}

@end

```

------[Leaking code

```
NSError *error;
NSArray *data = [self.managedObjectContext executeFetchRequest:request error:&error];
if (data == nil || [data count] == 0) {
    DLog(@"No data.")
} else {
    for (int i=0; i < [data count]; i++) {
        TaskEntity *task = [data objectAtIndex:i];

        NSString *areaKey = task.activity.project.area.title.text;
        NSString *projectKey = task.activity.project.title.text;
        NSString *activityKey = task.activity.title.text;

        ReportDetailItem *areaContainer;
        if (![dataSource objectForKey:areaKey]) {
            areaContainer = [[[ReportDetailItem alloc] init] autorelease];
        } else { 
            areaContainer = [dataSource objectForKey:areaKey];
        }
        areaContainer.total = [NSNumber numberWithInt:([task.seconds intValue] + [areaContainer.total intValue])];
        [dataSource setObject:areaContainer forKey:areaKey];

        ReportDetailItem *projectContainer;
        if (![areaContainer.items objectForKey:projectKey]) {
            projectContainer = [[[ReportDetailItem alloc] init] autorelease];
        } else {
            projectContainer = [areaContainer.items objectForKey:projectKey];
        }
        projectContainer.total = [NSNumber numberWithInt:([task.seconds intValue] + [projectContainer.total intValue])];
        [areaContainer.items setObject:projectContainer forKey:projectKey];

        ReportDetailItem *activityContainer;
        if (![projectContainer.items objectForKey:activityKey]) {
            activityContainer = [[[ReportDetailItem alloc] init] autorelease];
        } else {
            activityContainer = [projectContainer.items objectForKey:activityKey];
        }
        activityContainer.total = [NSNumber numberWithInt:([task.seconds intValue] + [activityContainer.total intValue])];
        [projectContainer.items setObject:activityContainer forKey:activityKey];

    }
}

```