• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
bitmapData leak
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

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

  • Follow-Ups:
    • Re: bitmapData leak
      • From: Jonathan Taylor <email@hidden>
  • Prev by Date: Determine Error from Webview loadRequest
  • Next by Date: Re: Determine Error from Webview loadRequest
  • Previous by thread: Re: Determine Error from Webview loadRequest
  • Next by thread: Re: bitmapData leak
  • Index(es):
    • Date
    • Thread