bitmapData leak
bitmapData leak
- Subject: bitmapData leak
- From: Jonathan Taylor <email@hidden>
- Date: Mon, 11 Apr 2011 12:53:15 +0100
I am battling a leak in my code and can't work out what I am doing wrong. I have a loop which accesses the raw bitmap data from a series of TIFF files I load from disk. My calls to [bitmapRep bitmapData] seem to (understandably) allocate memory, but I cannot work out how to allow that memory to be released again. What am I missing?
I've found various threads including this one:
http://stackoverflow.com/questions/4170799/objc-leak-behavior-i-cant-explain
that suggest autorelease pools should solve the problem. However the following code still leaks memory:
// Utility function used in main code:
NSBitmapImageRep *RawBitmapFromImage(NSImage *image)
{
NSBitmapImageRep *result = nil;
NSArray *repArray = [image representations];
for (size_t imgRepresentationIndex = 0; imgRepresentationIndex < repArray.count; ++imgRepresentationIndex)
{
NSObject *imageRepresentation = [repArray objectAtIndex:imgRepresentationIndex];
if ([imageRepresentation isKindOfClass:[NSBitmapImageRep class]])
{
ALWAYS_ASSERT(result == nil); // If we fail this then there are two different bitmap representations stored
// (need to decide what to do then...)
result = (NSBitmapImageRep*)imageRepresentation;
}
}
ALWAYS_ASSERT(result != nil); // If we fail this then there was no bitmap representation stored (vector image?)
return [[result retain] autorelease];
}
// Main code:
for (int i = firstIndex; i <= lastIndex; i++)
{
printf("add frame from file \"%s\"\n", NSStringForFrameNumber(i).cString);
NSImage *frameImage = [[NSImage alloc] initWithContentsOfFile:NSStringForFrameNumber(i)];
// Temp code to debug serious memory leak
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSBitmapImageRep *bitmapRep = RawBitmapFromImage(frameImage);
/* If I comment out the following line then there are no major leaks.
With this line in place, bitmapData is leaked, in that ObjectAlloc
shows a whole load of allocations from within the call to bitmapData
that build up until all memory is full. */
unsigned char * bitMapDataPtr = [bitmapRep bitmapData];
[pool drain];
[frameImage release]; // I have tried swapping these two calls around, to no effect (unsurprisingly)...
}
Please can somebody suggest what I am missing here? I am tearing my hair out over this one. I can post a full compilable demo if necessary.
Many thanks for any pointers on this one
Jonny_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden