Re: Why does this leak memory?
Re: Why does this leak memory?
- Subject: Re: Why does this leak memory?
- From: Matt Ball <email@hidden>
- Date: Mon, 11 Jul 2005 17:48:45 -0400
It's no longer leaking; it just crashes when I click on a row - I can
add as many rows as I want, however, as long as I don't click on any.
When I add in my copyWithZone: method, the crashes stop, but my cell
editing gets weird. Here's my copyWithZone: code:
- (id)copyWithZone:(NSZone *)zone
{
LayerCell *copy = [[[self class] alloc] init];
[copy setImage: [self image]];
return copy;
}
- Matt Ball
On 7/11/05, Ryan Stevens <email@hidden> wrote:
> Bummer. Is it still crashing, leaking or both?
>
> And another thing to try..
>
> - (void)tableView:(NSTableView *)tableView willDisplayCell:(id)cell
> forTableColumn:(NSTableColumn *)tableColumn row:(int)row
> {
> NSMutableArray *layersArray = [[[NSDocumentController
> sharedDocumentController] currentDocument] layersArray];
> NSMutableDictionary *layerDictionary = [layersArray
> objectAtIndex:row];
> if(layersArray != nil) {
> if([[tableColumn identifier] isEqualToString:@"titleColumn"]) {
> NSImage *layerImage = [[layerDictionary
> objectForKey:@"Image"] copy];
> NSImage *shadowedImage = [NSImage
> shadowedImageWithImage:layerImage
> rowHeight:[layersView rowHeight]];
>
> NSLog(@"layerImage: %@", layerImage);
> NSLog(@"shadowedImage: %@", shadowedImage);
>
> [layerImage release];
>
> if(shadowedImage != nil)
> [cell setImage:shadowedImage];
> }
> }
> }
>
>
>
>
> On Jul 11, 2005, at 2:18 PM, Matt Ball wrote:
>
> > No change. :/
> >
> > - Matt Ball
> >
> > On 7/11/05, Ryan Stevens <email@hidden> wrote:
> >
> >> It's just a guess but maybe it's getting released out from under
> >> you so try
> >> retaining and releasing it in shadowedImageWithImage:..
> >>
> >> + (NSImage *)shadowedImageWithImage:(NSImage *)image
> >> rowHeight:(int)rowHeight
> >> {
> >> if (!image) return nil; // if it doesn't exist you should bail
> >> here.
> >>
> >> [image retain]; // make sure it sticks around
> >>
> >> float thumbnailHeight = rowHeight * 0.85;
> >> float thumbnailWidth = (thumbnailHeight / [image size].height) *
> >> [image size].width;
> >> NSSize thumbnailSize = NSMakeSize(thumbnailHeight,
> >> thumbnailWidth);
> >>
> >> [image setFlipped:YES];
> >> NSImage *resizedImage = [[NSImage alloc]
> >> initWithSize:thumbnailSize];
> >> [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 setFlipped:NO];
> >>
> >> int squareSize = 3;
> >> NSImage *imageCanvas = [[NSImage alloc]
> >> initWithSize:thumbnailSize];
> >> [imageCanvas lockFocus];
> >> NSRect imageFrame = NSMakeRect(0, 0, [imageCanvas size].width,
> >> [imageCanvas size].height);
> >> NSImage *transparencyPattern = [[NSImage alloc]
> >> initWithSize:NSMakeSize(2*squareSize, 2*squareSize)];
> >> [transparencyPattern lockFocus];
> >> [[NSColor colorWithCalibratedWhite:0.8 alpha:1.0] set];
> >> NSRectFill(NSMakeRect(0,0,squareSize,squareSize));
> >>
> >> NSRectFill(NSMakeRect(squareSize,squareSize,squareSize,squareSize));
> >> [[NSColor whiteColor] set];
> >>
> >> NSRectFill(NSMakeRect(squareSize,0,squareSize,squareSize));
> >>
> >> NSRectFill(NSMakeRect(0,squareSize,squareSize,squareSize));
> >> [transparencyPattern unlockFocus];
> >> [[NSColor colorWithPatternImage:transparencyPattern]
> >> set];
> >> NSRectFill(imageFrame);
> >> [resizedImage compositeToPoint:NSMakePoint(0, 0)
> >> operation:NSCompositeSourceOver];
> >> [imageCanvas unlockFocus];
> >> [transparencyPattern release];
> >>
> >> thumbnailSize.width += 4;
> >> thumbnailSize.height += 4;
> >>
> >> NSImage *shadowCanvas = [[NSImage alloc]
> >> initWithSize:thumbnailSize];
> >> [shadowCanvas lockFocus];
> >> NSShadow *theShadow = [[NSShadow alloc] init];
> >> [theShadow setShadowColor:[NSColor blackColor]];
> >> [theShadow setShadowBlurRadius:4];
> >> [theShadow set];
> >> [imageCanvas compositeToPoint:NSMakePoint(2, 1)
> >> operation:NSCompositeSourceOver];
> >> [shadowCanvas unlockFocus];
> >> [theShadow release];
> >>
> >> [resizedImage release];
> >> [imageCanvas release];
> >> [image release]; // set it free
> >>
> >> return [shadowCanvas autorelease];
> >> }
> >>
> >>
> >>
> >>
> >> On Jul 11, 2005, at 2:04 PM, Matt Ball wrote:
> >>
> >> "image" comes from a dictionary within an array. Each row has a
> >> dictionary assigned to it which stores a variety of information about
> >> it. The image is one of those things. Also, I rewrote the original
> >> shadowedImageWithImage code a long ways back in the chain of
> >> messages.
> >> It is currently:
> >>
> >> + (NSImage *)shadowedImageWithImage:(NSImage *)image
> >> rowHeight:(int)rowHeight
> >> {
> >> float thumbnailHeight = rowHeight * 0.85;
> >> float thumbnailWidth = (thumbnailHeight / [image size].height) *
> >> [image size].width;
> >> NSSize thumbnailSize = NSMakeSize(thumbnailHeight,
> >> thumbnailWidth);
> >>
> >>
> >> [image setFlipped:YES];
> >> NSImage *resizedImage = [[NSImage alloc]
> >> initWithSize:thumbnailSize];
> >> [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 setFlipped:NO];
> >>
> >>
> >> int squareSize = 3;
> >> NSImage *imageCanvas = [[NSImage alloc]
> >> initWithSize:thumbnailSize];
> >> [imageCanvas lockFocus];
> >> NSRect imageFrame = NSMakeRect(0, 0, [imageCanvas size].width,
> >> [imageCanvas size].height);
> >> NSImage *transparencyPattern = [[NSImage alloc]
> >> initWithSize:NSMakeSize(2*squareSize, 2*squareSize)];
> >> [transparencyPattern lockFocus];
> >> [[NSColor colorWithCalibratedWhite:0.8 alpha:1.0] set];
> >> NSRectFill(NSMakeRect(0,0,squareSize,squareSize));
> >>
> >> NSRectFill(NSMakeRect(squareSize,squareSize,squareSize,squareSize));
> >> [[NSColor whiteColor] set];
> >>
> >> NSRectFill(NSMakeRect(squareSize,0,squareSize,squareSize));
> >>
> >> NSRectFill(NSMakeRect(0,squareSize,squareSize,squareSize));
> >> [transparencyPattern unlockFocus];
> >> [[NSColor colorWithPatternImage:transparencyPattern]
> >> set];
> >> NSRectFill(imageFrame);
> >> [resizedImage compositeToPoint:NSMakePoint(0, 0)
> >> operation:NSCompositeSourceOver];
> >> [imageCanvas unlockFocus];
> >> [transparencyPattern release];
> >>
> >>
> >> thumbnailSize.width += 4;
> >> thumbnailSize.height += 4;
> >>
> >>
> >> NSImage *shadowCanvas = [[NSImage alloc]
> >> initWithSize:thumbnailSize];
> >> [shadowCanvas lockFocus];
> >> NSShadow *theShadow = [[NSShadow alloc] init];
> >> [theShadow setShadowColor:[NSColor blackColor]];
> >> [theShadow setShadowBlurRadius:4];
> >> [theShadow set];
> >> [imageCanvas compositeToPoint:NSMakePoint(2, 1)
> >> operation:NSCompositeSourceOver];
> >> [shadowCanvas unlockFocus];
> >> [theShadow release];
> >>
> >>
> >> [resizedImage release];
> >> [imageCanvas release];
> >>
> >>
> >> return [shadowCanvas autorelease];
> >> }
> >>
> >> - Matt Ball
> >>
> >> On 7/11/05, Ryan Stevens <email@hidden> wrote:
> >>
> >> Okay...
> >>
> >> I would try retaining 'image' at the beginning of
> >> shadowedImageWithImage: and releasing it before returning (since it's
> >> not clear to me where this image really comes from or who owns it).
> >> This way it's guaranteed to stick around long enough for you to draw
> >> it into 'resizedImage'...
> >>
> >> + (NSImage *)shadowedImageWithImage:(NSImage *)image
> >> {
> >> if (!image) return nil;
> >>
> >> [image retain]; // we want this to stick around a bit
> >> [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 release]; // we don't need this anymore.
> >>
> >> return [resizedImage autorelease];
> >> }
> >
>
>
_______________________________________________
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