2009-11-15 81 views
3

所以我試圖在我的應用程序中複製SourceView示例。我可以完美地生成源列表,很好。我也可以擴展容器,一切都很好顯示。但是,當我在列表中選擇一個項目時,應用程序會崩潰並伴隨EXC_BAD_ACCESS。NSImage泄漏?

回溯

#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

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

大綱視圖委託

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

      } 
    } 

} 
+0

嘗試在調試模式下運行它。在單擊某個項目時調用的方法中放置一個斷點。然後,您可以步驟到exc_bad_access。 – nash 2009-11-17 17:45:33

回答

2

的問題是在我的自定義NSTextFieldCell:我需要實現copyWithZone。

+1

我剛剛遇到同樣的問題。感謝您的解決方案。 – David 2011-02-22 18:15:48

+0

你無法想象我花了多長時間解決這個問題,謝謝!你是怎麼發現的? – v1Axvw 2013-08-08 19:10:09