• 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
Re: Weird malloc error when dealing with lots of NSImage objects
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Weird malloc error when dealing with lots of NSImage objects


  • Subject: Re: Weird malloc error when dealing with lots of NSImage objects
  • From: Roland King <email@hidden>
  • Date: Mon, 7 Sep 2009 21:00:01 +0800

where's this getting called? Is it getting called from a timer or button press or other event, or do you do a whole load of these in a loop?

It seems to me that everything you have init'ed you have released again, however surface is autoreleased, so it won't actually get dealloced until the innermost autoreleasepool is drained. If you're calling this function in a loop then you're not getting to that pool drain and you're piling up memory.

But you don't need to guess, fire up instruments, run with object allocations, that will very quickly show you where your memory is going. If you have some unbalanced release I didn't see here, you'll see it there, if you're piling up on an autorelease pool you'll see that too as the stack trace for the memory (if you enable the right options) will show you the last thing which happened is autorelease.



On 07-Sep-2009, at 7:45 PM, DairyKnight wrote:

Hi all,


I keep on getting weird malloc errors with the following code, first from
ATSFontManager, and then:


FooProgram(1343,0xa01e1720) malloc: *** mmap(size=30855168) failed (error
code=12)


*** error: can't allocate region

*** set a breakpoint in malloc_error_break to debug

2009-09-07 19:37:17.606 KindPDF[1343:10b] *** NSCopyMemoryPages (0xfc18a000,
0x0, 30851072) failed



It seems to me that somewhere I have a memory leak, but I just cannot figure
out where.


What the function does is to take in a PDFPage and crop according to some
cropRect and scale down to


render the page on some surface with arbitrary geometry.

The program fails after processed for around 400 images with a device size
of 786x1144 and RENDER_SCALE_FACTOR


of 2. MAX_POINTS of 300 (This constant is to make the cropRect units
percetages)


Hope someone could help me.... this program has been making me mad for around a week... Thanks.




-(NSImage *) generatePage:(PDFPage *) page withCropRect:(CropRect) cropRect
onDevice:(NSSize) deviceSize


{

NSRect originalPageMediaBox = [page boundsForBox:kPDFDisplayBoxMediaBox];

NSRect croppedPageMediaBox = NSMakeRect((float) originalPageMediaBox.size.
width * (float)cropRect.left / MAX_POINTS,


(float)originalPageMediaBox.size.height * (float)cropRect.bottom /
MAX_POINTS,

originalPageMediaBox.size.width * (1.0 - (float)cropRect.horiCropped /
MAX_POINTS),

originalPageMediaBox.size.height * (1.0 - (float) cropRect.vertCropped /
MAX_POINTS));



float croppedPDFAspectRatio = croppedPageMediaBox.size.height / croppedPageMediaBox.size.width;

float deviceAspectRatio = deviceSize.height / deviceSize.width;

float width, height;

if (croppedPDFAspectRatio > deviceAspectRatio)

{

height = deviceSize.height;

width = height / croppedPDFAspectRatio;

} else

{

width = deviceSize.width;

height = width * croppedPDFAspectRatio;

}

width = width * RENDER_SCALE_FACTOR;

height = height * RENDER_SCALE_FACTOR;

//

// Crop the PDF Page

//

NSPDFImageRep *pdfImg = [NSPDFImageRep imageRepWithData:[page
dataRepresentation]];

NSSize pageSize = NSMakeSize(width / (1.0 - cropRect.horiCropped /
MAX_POINTS), height / 1.0 - cropRect.vertCropped / MAX_POINTS);

NSImage *pdfPage = [[NSImage alloc] initWithSize:pageSize];

[pdfPage lockFocus];

[pdfImg drawInRect:[pdfPage rect]];

[pdfPage unlockFocus];


NSBitmapImageRep *pdfPageRep = [NSBitmapImageRep imageRepWithData: [pdfPage
TIFFRepresentation]];


NSImage *rasterizedPage = [[NSImage alloc] initWithSize:NSMakeSize (width,
height)];


[rasterizedPage lockFocus];

[[NSColor whiteColor] setFill];

NSRectFill(NSMakeRect(0, 0, width, height));

[pdfPageRep drawAtPoint:NSMakePoint(-1 * width * cropRect.left / MAX_POINTS,
-1 * height * cropRect.bottom / MAX_POINTS)];


[rasterizedPage unlockFocus];

[pdfPage release];

//

// Scale down to original size

//

NSImage *surface = [[[NSImage alloc] initWithSize:NSMakeSize(width /
RENDER_SCALE_FACTOR, height / RENDER_SCALE_FACTOR)] autorelease];


[surface lockFocus];

[rasterizedPage drawInRect:[surface rect] fromRect:[rasterizedPage rect]
operation:NSCompositeCopy fraction:1];


[surface unlockFocus];

[rasterizedPage release];

return surface;

}
_______________________________________________

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

_______________________________________________

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


References: 
 >Weird malloc error when dealing with lots of NSImage objects (From: DairyKnight <email@hidden>)

  • Prev by Date: Re: Crash on SL in com.apple.DesktopServices after using NSOpenPanel
  • Next by Date: Re: document-based application
  • Previous by thread: Weird malloc error when dealing with lots of NSImage objects
  • Next by thread: Re: Weird malloc error when dealing with lots of NSImage objects
  • Index(es):
    • Date
    • Thread