Jon
Jon

Reputation: 4732

Where am I leaking memory here? Used Instruments

Instruments is saying there is a memory leak in this code:

- (void)layoutImageMaskViewForImageAtPath:(NSString *)path withFillColor:(UIColor *)color indexPath:(NSIndexPath *)indexPath {
    UIImage *image = [UIImage imageWithContentsOfFile:path];
    [self layoutImageMaskViewForImage:image withFillColor:color indexPath:indexPath];
}

UIColor *anIconFillColor = [UIColor colorWithWhite:0.70 alpha:1.0];
NSIndexPath *anIndexPath = [NSIndexPath indexPathForRow:0 inSection:0];
NSString *aPlaceholderPath = [[NSBundle mainBundle] pathForResource:@"path" ofType:@"png"];
[self layoutImageMaskViewForImage:anImage withFillColor:anIconFillColor indexPath:anIndexPath];

and

NSDictionary *anAssignedData = [aReservationData objectForKey:kAssignedSectionKey];
NSMutableArray *anEmployeeTaskQueueList = [NSMutableArray array];
NSArray *anAssignedReservationData = [anAssignedData objectForKey:kEmployeesIdentifier];

for (NSDictionary *aJobQueueData in anAssignedReservationData) {
    EmployeeReservationQueue *anAssignedTaskQueue = [[EmployeeReservationQueue alloc] initWithServerDictionary:aJobQueueData];

    if (anAssignedTaskQueue.rows.count == 0) {
        ReservationTrack *aTrack = [[ReservationTrack alloc] init];
        aTrack.rowSortOrder = 0;
        aTrack.reservations = [NSArray array];
        anAssignedTaskQueue.rows = [NSArray arrayWithObject:aTrack];
        [aTrack release];
    }

    [anEmployeeTaskQueueList addObject:anAssignedTaskQueue];
    [anAssignedTaskQueue release];
}

Upvotes: 0

Views: 186

Answers (4)

rob mayoff
rob mayoff

Reputation: 386008

Instruments reports that your app is leaking a ReservationTrack object. By default it shows where the leaked object was allocated, which is the code you posted. The code you posted doesn't leak a ReservationTrack. It stores it in an EmployeeReservationQueue which is stored in an NSMutableArray. One possibility is that you later access the ReservationTrack object, send it retain, and don't send it release or autorelease. Another possibility is that you leak the EmployeeReservationQueue or the NSMutableArray.

If you use the simulator, you can see the full retain/release history of most objects. When a leaked object shows up, mouse over the address of the object and click the right arrow that appears next to the address. Instruments will show you every malloc, retain, release, and autorelease event for that object. If you choose View > Extended Detail from the menu bar, you can click on any of those events and see the stack trace of the event. This should help you track down the unbalanced retain.

Upvotes: 0

OdNairy
OdNairy

Reputation: 540

Gold memory-management rule in Objective-C :
Each 'init', 'copy','mutableCopy','retain' must call then 'release' or 'autorelease'.

Upvotes: 1

Nekto
Nekto

Reputation: 17877

In second case here:

[aTrack release];

What is aTrack? May be you mean [track release];?

In first case probably that you pass to function non-autoreleased parameters or may be you are not releasing them after calling that method. Just post code where you call for that method and I will check.

Upvotes: 1

Carl Norum
Carl Norum

Reputation: 225202

Your second example leaks track. Your last line is releasing aTrack instead.

Upvotes: 1

Related Questions