views:

77

answers:

2

Hello all,

I'm currently facing the following issue:

My app dynamically creates images (320 x 480 pixels) and adds them to a NSMutableArray. I need those images inside that array in order to allow users to browse through them back and forth. I only need to keep the latest 5 images. So I wrote a method like below:

- (void)addImageToArray:(UIImage*)theImage {
    if ([myMutableArray count] < 5) {
        [myMutableArray addObject:theImage];
    }
    else {
        [myMutableArray removeObjectAtIndex:0];
        [myMutableArray addObject:theImage];
    }
}

This method basically does what it's supposed to do. However, in instruments I can see, that memory usage is permanently incrementing. At some point, even though I do not have any memory leaks, the app finally crashes. The way I see it, XCode does remove the image from my array, but does not release it. Is there a way I can make sure, that the object I want to remove from my array will also get released? Maybe my approach is completely wrong and I need to find a different way.

Any help appreciated. Thanks in advance

[EDIT:]

As requested, I'm adding part of my code, which creates the image:

-(UIImage*)getGL {
unsigned char buffer[320*480*4];
glReadPixels(0,0,320,480,GL_RGBA,GL_UNSIGNED_BYTE,&buffer);

CGDataProviderRef ref = CGDataProviderCreateWithData(NULL, &buffer, 320*480*4, NULL);
CGImageRef iref = CGImageCreate(320,480,8,32,320*4,CGColorSpaceCreateDeviceRGB(),kCGBitmapByteOrderDefault,ref,NULL,true,kCGRenderingIntentDefault);

size_t width         = CGImageGetWidth(iref);
size_t height        = CGImageGetHeight(iref);
size_t length        = width*height*4;
uint32_t *pixels     = (uint32_t *)malloc(length);
CGContextRef _context = CGBitmapContextCreate(pixels, width, height, 8, width*4, CGImageGetColorSpace(iref), kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGContextTranslateCTM(_context, 0.0, height);
CGContextScaleCTM(_context, 1.0, -1.0);
CGContextDrawImage(_context, CGRectMake(0.0, 0.0, width, height), iref);
CGImageRef outputRef = CGBitmapContextCreateImage(_context);
UIImage *outputImage = [UIImage imageWithCGImage:outputRef];


CGDataProviderRelease(ref);
CGImageRelease(iref);
CGImageRelease(outputRef);
CGContextRelease(_context);

return outputImage;
}

So, now I can do something like this:

[self addImageToArray:[self getGL]];

Hope, this helps. Thanks again.

+1  A: 

There may be several reasons that the memory isn't being freed.

One is that you're adding all the images in a loop and the autorelease pool isn't releasing autoreleased objects until control gets back to the run loop. You might want to create and release a NSAutoreleasePool for each time through the loop.

Another is that the objects aren't being properly released. Use "Build and Analyze" to find any obvious memory leaks.

lucius
A: 

Alright, problem found - problem solved :)

Actually my getGL method was missing something:

free(pixels);

That didn't cause any memory leaks, but incrementing memory instead. Now everything is back to normal.

Friendlydeveloper