Yeah, so this question isn't a dumbass one, I swear. Here's what I want to do: draw an image in an NSView that the user picks and can choose at a later time. I have written the code in both Java and ObjC so I'm not discriminating against anyone here. Here it is:
Java
<BLOCKQUOTE><font size="1"face="Geneva, Verdana, Arial">code:</font><HR><pre><font size=1 face=courier>
<font color = brown>/* ImageTester */</font>
import com.apple.cocoa.foundation.*;
import com.apple.cocoa.application.*;
<font color = green>public</font> class ImageTester extends NSView
{
<font color = brown>//NSTimer recompositeTimer;</font>
NSColor color;
<font color = green>public</font> ImageTester(NSRect frame)
{
<font color = purple>super</font>(frame);
}
<font color = green>public</font> <font color = green>void</font> awakeFromNib()
{
<font color = brown>//recompositeTimer = new NSTimer(<font color = blue>1</font>, <font color = green>this</font>, new NSSelector(<font color = red>"updateView"</font>, new Class[]{<font color = green>this</font>.getClass()}), <font color = green>this</font>, true);</font>
<font color = brown>//NSRunLoop.currentRunLoop().addTimerForMode(recompo siteTimer, NSRunLoop.DefaultRunLoopMode);</font>
}
<font color = green>public</font> <font color = green>void</font> drawRect(NSRect frame)
{
NSColor.clearColor().set();
NSBezierPath.fillRect(<font color = green>this</font>.bounds());
<font color = green>if</font>(color!=null)
{
color.set();
NSBezierPath.fillRect(<font color = green>this</font>.bounds());
}
}
<font color = green>public</font> <font color = green>void</font> setImage(NSButton sender)
{
NSOpenPanel me = NSOpenPanel.openPanel();
<font color = green>if</font>(me.runModalForTypes(NSImage.imageFileTypes() )==NSPanel.OKButton)
color = NSColor.colorWithPatternImage(new NSImage(new NSData(new java.io.File((String)me.filenames().objectAtIndex( <font color = blue>0</font>)))));
setNeedsDisplay(true);
}
<font color = green>public</font> <font color = green>void</font> updateView(NSTimer a)
{
setNeedsDisplay(true);
}
}
</font>[/code]
ObjC
<BLOCKQUOTE><font size="1"face="Geneva, Verdana, Arial">code:</font><HR><pre><font size=1 face=courier>
<font color = brown>/*ImageTester.h */</font>
#import <Cocoa/Cocoa.h>
<font color = purple>@interface</font> ImageTester : NSView
{
NSColor *color;
}
- (<font color = purple>id</font>)initWithFrame

NSRect)frame;
- (<font color = green>void</font>)dealloc;
- (<font color = green>void</font>)drawRect

NSRect)rect;
- (<font color = purple>IBAction</font>)setImage

<font color = purple>id</font>)sender;
<font color = purple>@end</font>
<font color = brown>/*ImageTester.m */</font>
#import <font color = red>"ImageTester.h"</font>
<font color = purple>@implementation</font> ImageTester
- (<font color = purple>id</font>)initWithFrame

NSRect)frame
{
[<font color = purple>super</font> initWithFrame:frame];
<font color = green>return</font> <font color = purple>self</font>;
}
- (<font color = green>void</font>)dealloc
{
[color release];
[<font color = purple>super</font> dealloc];
}
- (<font color = green>void</font>)drawRect

NSRect)rect
{
[[NSColor clearColor] set];
NSRectFill([<font color = purple>self</font> bounds]);
<font color = green>if</font>(color!=<font color = green>nil</font>)
{
[color set];
NSRectFill([<font color = purple>self</font> bounds]);
}
}
- (<font color = purple>IBAction</font>)setImage

<font color = purple>id</font>)sender
{
NSOpenPanel *me = [NSOpenPanel openPanel];
<font color = green>if</font>([me runModalForTypes:[NSImage imageFileTypes]]==<font color = blue>1</font>)
{
[color autorelease];
color = [[NSColor colorWithPatternImage:[[NSImage alloc] initWithData:[NSData dataWithContentsOfFile:[[me filenames] objectAtIndex:<font color = blue>0</font>]]]] retain];
[<font color = purple>self</font> setNeedsDisplay:<font color = purple>YES</font>];
}
}
<font color = purple>@end</font>
</font>[/code]
Of course they're linked in IB. But that has nothing to do with my problem. Everytime I set a new image, the ram usage goes up, even if I pick a significantly smaller image than the previous. I've been able to run up my ram usage to upwards of 100MB, which is really really bad.
My theory is that this has something to do with the way Cocoa caches images, but I don't know how to flush the cache. Does anyone know why my program likes to eat ram?
Hoping this isn't a dumbass question,
F-bacher