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];
}