Re: Why does this leak memory?
Re: Why does this leak memory?
- Subject: Re: Why does this leak memory?
- From: Ryan Stevens <email@hidden>
- Date: Mon, 11 Jul 2005 11:51:11 -0700
On Jul 10, 2005, at 4:34 PM, Matt Ball wrote:
I have a function which resizes an image and adds a drop shadow to it.
I've determined that it is leaking several NSImage instances. I've
taken out some code in order to narrow it down, and I've determined
that this is causing the leak:
- (NSImage *)shadowedImageWithImage:(NSImage *)image
{
[image setFlipped:YES];
// Resize the image, and make sure to antialias it.
float thumbnailHeight = [tableView rowHeight] * 0.85;
float thumbnailWidth = (thumbnailHeight / [image size].height) *
[image size].width;
NSImage *resizedImage = [[NSImage alloc]
initWithSize:NSMakeSize(thumbnailHeight, thumbnailWidth)];
[resizedImage lockFocus];
[NSGraphicsContext saveGraphicsState];
[[NSGraphicsContext currentContext]
setImageInterpolation:NSImageInterpolationHigh];
[image drawInRect:NSMakeRect(0.0, 0.0, thumbnailWidth,
thumbnailHeight) fromRect:NSMakeRect(0.0, 0.0, [image size].width,
[image size].height) operation:NSCompositeCopy fraction:1.0];
[NSGraphicsContext restoreGraphicsState];
[resizedImage unlockFocus];
image = [resizedImage retain];
[resizedImage release];
return image;
}
Could anyone help me figure out why this is leaking? I've read up on
retain counts, and I think that when I retain "resizedImage," I
increase the retain count such that [resizedImage release]; doesn't
completely release it.
Any help would be greatly appreciated.
I would put this in a category and write it like so ...
+ (NSImage *)shadowedImageWithImage:(NSImage *)image
{
if (!image) return nil;
[image setFlipped:YES];
// Resize the image, and make sure to antialias it.
float thumbnailHeight = [tableView rowHeight] * 0.85;
float thumbnailWidth = (thumbnailHeight / [image size].height) *
[image size].width;
NSImage *resizedImage = [[NSImage alloc]
initWithSize:NSMakeSize(thumbnailHeight, thumbnailWidth)];
[resizedImage lockFocus];
[NSGraphicsContext saveGraphicsState];
[[NSGraphicsContext currentContext]
setImageInterpolation:NSImageInterpolationHigh];
[image drawInRect:NSMakeRect(0.0, 0.0, thumbnailWidth,
thumbnailHeight) fromRect:NSMakeRect(0.0, 0.0, [image size].width,
[image size].height) operation:NSCompositeCopy fraction:1.0];
[NSGraphicsContext restoreGraphicsState];
[resizedImage unlockFocus];
return [resizedImage autorelease];
}
It seems to me that image = [resizedImage retain]; is your problem.
You don't want to do that there. Instead...
- (void)doTheSameThingMinusTheClobber
{
NSImage *shadowed = [NSImage shadowedImageWithImage:image];
if (!shadowed) return; // NSLog(@"ahh!");
[image release];
image = [shadowed retain];
}
_______________________________________________
Do not post admin requests to the list. They will be ignored.
Cocoa-dev mailing list (email@hidden)
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden