NSImage leaking?

Discussion in 'Mac Programming' started by Aranince, Nov 12, 2009.

  1. Aranince macrumors 65816

    Joined:
    Apr 18, 2007
    Location:
    California
    #1
    So I'm trying to duplicate the SourceView example in my app. I can generate the source list perfectly, fine. I can also expand the containers, and everything is displayed fine. However, when I select an item in the list, the app crashes with an EXC_BAD_ACCESS.

    Backtrace:
    Code:
    #0	0x7fff86532340 in objc_msgSend_vtable14
    #1	0x7fff8508f622 in -[NSImage _deallocAuxiliaryStorage]
    #2	0x7fff8508f5a1 in -[NSImage dealloc]
    *#3	0x100002913 in -[SourceListCell setImage:] at SourceListCell.m:23
    *#4	0x100001c31 in -[ProjectController outlineView:willDisplayCell:forTableColumn:item:] at ProjectController.m:166
    #5	0x7fff85103085 in -[NSTableView preparedCellAtColumn:row:]
    #6	0x7fff8511bc3f in -[NSTableView _drawContentsAtRow:column:withCellFrame:]
    #7	0x7fff8511bbb5 in -[NSOutlineView _drawContentsAtRow:column:withCellFrame:]
    #8	0x7fff8511acd8 in -[NSTableView drawRow:clipRect:]
    #9	0x7fff8511a5cb in -[NSTableView drawRowIndexes:clipRect:]
    #10	0x7fff8511a44c in -[NSOutlineView drawRowIndexes:clipRect:]
    

    SourceListCell
    Code:
    @interface SourceListCell : NSTextFieldCell {
    	NSImage *image;
    }
    
    @property(nonatomic, retain) NSImage *image;
    
    @end
    
    - (id)init {
    	self = [super init];
    	
    	[self setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]];
    	
    	return self;
    }
    
    - (void)dealloc {
    	[image release];
    	image = nil;
    	[super dealloc];
    }
    
    - (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView {
    	if (image != nil) {
    		[image setSize:NSMakeSize(kIconImageSize, kIconImageSize)];
    		// the cell has an image: draw the normal item cell
    		NSSize imageSize;
            NSRect imageFrame;
    		
            imageSize = [image size];
            NSDivideRect(cellFrame, &imageFrame, &cellFrame, 3 + imageSize.width, NSMinXEdge);
    		
            imageFrame.origin.x += kImageOriginXOffset;
    		imageFrame.origin.y -= kImageOriginYOffset;
            imageFrame.size = imageSize;
    		
            if ([controlView isFlipped])
                imageFrame.origin.y += ceil((cellFrame.size.height + imageFrame.size.height) / 2);
            else
                imageFrame.origin.y += ceil((cellFrame.size.height - imageFrame.size.height) / 2);
    		[image compositeToPoint:imageFrame.origin operation:NSCompositeSourceOver];
    		
    		NSRect newFrame = cellFrame;
    		newFrame.origin.x += kTextOriginXOffset;
    		newFrame.origin.y += kTextOriginYOffset;
    		newFrame.size.height -= kTextHeightAdjust;
    		[super drawWithFrame:newFrame inView:controlView];
        }
    }
    Code:
    - (void)outlineView:(NSOutlineView *)outlineView willDisplayCell:(NSCell*)cell forTableColumn:(NSTableColumn*)tableColumn item:(id)item {
    	if ([[tableColumn identifier] isEqualToString:COLUMNID_NAME]) {
    			if ([cell isKindOfClass:[SourceListCell class]]) {
    				//item = [item representedObject];
    				NSImage *iconImage;
    				iconImage = [[NSWorkspace sharedWorkspace] iconForFile:[item path]];
    				[item setNodeIcon:iconImage];
    				
    				[(SourceListCell*)cell setImage:[item nodeIcon]];
    				
    			}
    	}
    	
    }
     
  2. ritsard macrumors regular

    ritsard

    Joined:
    Jun 18, 2009
    Location:
    SF Bay Area, CA
    #2
    looks like the method where the bad access if from this

    -[NSOutlineView drawRowIndexes:clipRect:]

    Can you post the method for this.
     

Share This Page